記一次串口通信調試,慎用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口打開后沒必要刻意去關閉,直接等到程序退出的時候關閉就可以了,對通信沒有任何影響。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM