记一次串口通信调试,慎用SerialPort.Close
做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑。
让我慢慢道来完整的经历。
项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信。
改成C#之后发现通信总有一段乱码,,之前的vb也没有这样的问题。思前想后总共也就那几句代码实在想不去哪里的问题。
调试也不知从何下手。最后下载了一个串口调试工具进行调试,发现明明应该8秒钟发一次请求,结果几乎每隔一秒左右就发送一次请求。
每次发送的都是一个未知字符。让我实在是想不出哪里的问题。大致代码如下。
1 SerialPort port = new SerialPort("COM1"); 2 port.BaudRate = 57600; 3 port.DataBits = 8; 4 port.Parity = Parity.None; 5 port.StopBits = StopBits.One; 6 if (!port.IsOpen) 7 port.Open(); 8 port.Write("ceshi"); 9 port.Close();
总共就这么几句代码,实在想不出哪里的问题,这个是在timer事件里执行的。
调试也是8秒钟进入一次代码。那在哪里会发生每秒发送一次信息呢?
调了各种通讯波段不行,加了各种代码过滤还是不知所以然。
最后尝试注释掉close,结果就神奇的没有每次通讯。这样也就没有出现乱码。
最后的坑居然是这句话 port.Close(); 真是怎么都没有想到。
SerialPort.Close 方法
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.close(v=vs.110).aspx
根据微软的解释,调用此方法会关闭 SerialPort 对象并清除接收缓冲区和传输缓冲区。
结合1楼 close会传输缓冲区,这样应该只会有一次,为何还会每隔一段时间产生通信?
建议:COM口打开后没必要刻意去关闭,直接等到程序退出的时候关闭就可以了,对通信没有任何影响。
GitHub:https://github.com/linezero
博客示例代码GitHub:https://github.com/linezero/Blog