使用 SerialPort 能方便的定义软件端的串口对象,并设置串口通信参数:
SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.RtsEnable = true;
上位机下发串口命令实现较简单,使用Write方法可将数据写入串行端口的输出缓冲区。
mySerialPort .Write(sendBuffer, 0, sendBuffer.Length);
接收串口上传数据比较tricky,也是出问题比较多的地方。通过触发SerialPort.DataReceived 事件表示串口接收了数据,并触发接收数据的处理程序。采用事件触发的方式对比使用轮询的方法比较节省时间,更加方便。
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
那么串口硬件不停地向上位机上传数据,何时触发DataReceived 事件呢?使用ReceivedBytesThreshold设置接收字节限制,当到达设定的字符个数或者收到文件结束字符时,将数据放入输入缓冲区时,触发事件。
mySerialPort.ReceivedBytesThreshold = 13;
实际上receivedbytesthreshold设置为1的时候,硬件也不会每个字节产生一次事件,因此要使用使用 BytesToRead 属性确定缓冲区中剩余的要读取的数据量,原因是:现在的PC不适合处理单个数据,而是一次处理批量数据。当你速率足够高时,PC是处理不过来的。只有一次缓冲一批数据,再一次处理,PC才能搞得定。
可以参考这个Blog,对SerialPort里面的接口和函数解释很清楚:串行通讯之.NET SerialPort – hanford – 博客园 (cnblogs.com)