串口通信
串口通信
在对串口进行编程时候,我们要向串口发送指令,然后我们解析串口返回的指令。从.NET Framework 2.0开始,C#提供了SerialPort类用于实现串口控制。命名空间:System.IO.Ports。
1、 常用的字段:PortName:获取或设置通信端口
BaudRate:获取或设置串行波特率Parity:获取或设置奇偶效验检查协议
DataBits:获取或设置每个字节的标准数据位长度
StopBits:获取或设置每个字节的标准停止位数
2、 常用方法:
Open:打开一个新的串行端口连接
Close:关闭端口连接,将IsOpen属性设置false,并释放内部Stream对象
Read:从SerialPort输入缓冲区中读取
Write:将数据写入串行端口输出缓冲区
Close:关闭端口连接,将IsOpen属性设置false,并释放内部Stream对象
Read:从SerialPort输入缓冲区中读取
Write:将数据写入串行端口输出缓冲区
GetPortNames:获取当前计算机的串行端口名称数组
3、常用事件:
DataReceived:表示将处理SerialPort对象的数据接收事件的方法
DisPosed:通过调用释放组件时发生Dispose方法(继承自Component)
4、SerialPort 控件使用流程
流程是设置通信端口号及波特率、数据位、停止位和校验位,再打开端口连接、发送数据、接收数据,最后关闭端口连接步骤。
注意:使用Unity是进行串口通信的时候,需要在Project Setting=>Player=>Other Settings=>Configuration中将API Compatibility Level 改成Mono.NET 2.0/4.0/其他。
代码示例
using System.IO.Ports; using System.Linq; using System.Threading; using UnityEngine; using UnityEngine.UI; public class RideSpeedSetter : MonoBehaviour { private SerialPort serialPort; public string portName = "COM3";//串口名 public int baudRate = 115200;//波特率 public Parity parity = Parity.None;//效验位 public int dataBits = 8;//数据位 public StopBits stopBits = StopBits.One;//停止位 public Slider speedSlider; public Button startBtn; public Button stopBtn; public Button exitBtn; public Text speedText; public Text angleText; public Thread receCOMData; void Start() { startBtn.onClick.AddListener(() => { StratRide(); }); stopBtn.onClick.AddListener(() => { StopRide(); }); exitBtn.onClick.AddListener(() => { Exit(); }); speedSlider.onValueChanged.AddListener((value) => { SpeedControl(value); }); serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits); if (!serialPort.IsOpen) { serialPort.Open(); //serialPort.WriteTimeout = 300;//com写入数据时间限制 //serialPort.ReadTimeout = 300;//com读取数据时间限制 } receCOMData = new Thread(ReceCOMData); receCOMData.Start(); } float timeCount = 0; void FixedUpdate() { timeCount += Time.fixedDeltaTime; if (timeCount > 0.09f) { if (!receCOMData.IsAlive) { receCOMData = new Thread(ReceCOMData); receCOMData.Start(); } timeCount = 0; ShowSpeed(); } } string data; private void ReceCOMData() { while (serialPort.IsOpen) { data = serialPort.ReadLine(); } } void StratRide() { SendData("A01\r\n"); Invoke("StartB", 1.2f); } void StartB() { SendData("B01\r\n"); } void StopRide() { SendData("A00\r\n"); Invoke("StopB", 1.2f); } void StopB() { SendData("B00\r\n"); } string speedValue; void SpeedControl(float value) { speedValue = "PWM" + ((int)(value * 80) + 10).ToString() + "\n"; SendData(speedValue); } void SendData(string data) { if (serialPort != null && serialPort.IsOpen) { serialPort.Write(data); } } float speedRate = 0.15f; void ShowSpeed() { angleText.text = "Received Data: " + data; speedText.text = "Speed: " + (speedRate * GetSpeed()).ToString("#0.00"); } float curNum = 0; float lastNum = 0; float speed; float GetSpeed() { if (!data.Contains(',')) return 666; int index = data.IndexOf(','); string before = data.Remove(index); string after = data.Substring(index + 1); curNum = float.Parse(after); speed = curNum - lastNum; lastNum = curNum; return speed; } void CloseSerialPort() { if (serialPort != null && serialPort.IsOpen) { serialPort.Close(); } } void Exit() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } void OnApplicationQuit() { receCOMData.Abort(); StopRide(); Invoke("CloseSerialPort", 1.5f); } }