做項目是遇到了串口通信,真是遇到了一個大坑,不知道是微軟的坑還是我的坑。
讓我慢慢道來完整的經歷。
項目中以前是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口打開后沒必要刻意去關閉,直接等到程序退出的時候關閉就可以了,對通信沒有任何影響。