今天用C#(VS2010,.Net Framework 3.5)写一个串口助手(使用System.IO.SerialPort类),异步接收,底层收到数据后触发DataReceived事件,在事件处理程序中读数据并以十六进制形式打印出来。测试时发现只要接收到0x1A,程序就会卡死,窗口上的按钮都没有反应(0x1A仍然正常打印了出来)。
此问题的原因是:.Net串口通信中将0x1A当作EOF处理,接收到EOF会触发两次数据到达事件,如果在第一次事件处理时用Read函数将数据读空,那么下一次调用Read时程序就会block,直到有新的数据到达。
解决方法:0x1A触发的两次事件,一次是EOF,一次是普通数据,在事件处理程序中判断事件类型,如果是EOF事件则不进行读操作。代码如下:
点击(此处)折叠或打开
  1. private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
  2.     if (e.EventType == SerialData.Eof)
  3.         return;
  4.     this.Invoke(serialRecvDelegate);
  5. }
项目源代码请移步Git@OSC:http://git.oschina.net/erabbit/CommTest

参考:
MSDN:https://social.msdn.microsoft.com/Forums/en-US/9621aa2e-9b1e-4024-a217-5b340b7e8f54/serial-port-issue-with-received-1a-hexadecimal-byte-in-net-20?forum=netfxbcl
Stack Overflow:http://stackoverflow.com/questions/12483711/serialdata-eof-circumstances
09-20 18:30