如今的串口通信主要應用在工控等領域,雖然不難,但是很多新人(包括一些老手)還是不能較好的實現 串口通信,下面簡單談談串口通信,如果有更好補充的朋友,請不吝賜教,讓本文成為串口通信文章的典范,更讓大量的新手能正確掌握串口通信。
首先,大家必須知道串口通信的特性:串口發送和接收數據比較慢,以致一條命令數據的發送和接收可能需要多次操作發送或接收緩沖區。
下面我主要搜集一些網絡上的串口通信文章或代碼,然后點評,提出自己的看法。
帖子1: 在C#中使用SerialPort類實現串口通信(陸續更新)
http://blog.csdn.net/cy757/article/details/4474930 這篇文章寫的很好,很有參考價值。
com.BaudRate = 115200;
com.PortName = "COM1";
這兩句代碼我點評一下,希望做UI的朋友提供友好的用戶界面,對自己的傳入數據的有效性控制也有幫助。1>串口波特率似乎只支持某幾種檔次如4800 | 9600 | 19200等等,所以希望UI做成選擇控件ComboBox而不是用戶輸入數字的TextBox。2>”COM1”也做成選擇,但還有兩點a>可以考慮SerialPort.GetPortNames枚舉本機存在的串口;b>如果打開了不存在的串口或者已經被打開的串口導致異常,一定要try捕獲異常,不能讓程序崩潰。
記住,接收數據有兩種方式,1>使用事件接收;2>使用a>線程接收;b>定時器接收; 3>在任何地方,直接調用串口Read方法讀數據,一定要杜絕Read永不返回導致卡死。
上文的private void ReadPort()線程函數有兩點值得學習:
1> catch (TimeoutException) { }; //沒有可以讀取的字節異常
2> Thread.Sleep(waitTime)。 //不能操作串口緩沖區時,讓時間片
記住,C#中跨線程訪問控件很危險,堅決杜絕,請使用Invoke之類的函數同步訪問。示例如private void serialPort1_DataReceived函數。
帖子2:C# 串口操作系列
http://blog.csdn.net/wuyazhe/article/details/5598945 里面5篇串口文章值得一看。
帖子3:基於C#實現PC機與AI調節器串口通信的實時監控系統
http://www.autooo.net/classid119-id57828.html 本文寫的較好,應用場景、功能、方案都很棒,唯一可惜的最終實現及編碼未能把多線程接收和解析串口數據部分源碼貢獻出來,可惜可惜!!
帖子4:借助VC++實現串口通訊程序中的多線程應用
http://www.ccw.com.cn/applic/prog/htm2003/20031211_13ZAR.htm
帖子5: 多線程串口通信技術在GPS導航中的應用(VC)
http://www.dzsc.com/data/html/2009-10-20/79533.html
CSerialPort類
帖子6:多串口多線程工業控制實現(CSerialPort類)
http://bbs.51cto.com/thread-417831-1.html 這篇文章寫的非常棒,值得一看。
下面兩行代碼告訴我們多個串口設備輪詢時的超時設置。
if((tNow - tLast)*1000 + (nNowMillSecond - nMillSecond[0]) > 800)9 x* g8 L4 N! R6 s0
pView->SetCommVal(); //發送下一台設備要數據命令或者進行其他的相關處理
帖子7: C#中SerialPort接了10個測溫傳感器,其接收事件只有一個,如果一個傳感器出錯,怎樣不影響別的傳感器正常接收
http://topic.csdn.net/u/20110518/21/9b0aec92-6c3f-43db-af02-8013db733210.html 這篇文章問題問的非常非常好,其次網友jsmouse貼的代碼有些地方值得借鑒。
先分析jsmouse代碼:
CRCData.CalculateCrc16(crcTemp, out CRCH, out CRCL);
if (buffer[10] != CRCH && buffer[11] != CRCL)
{
buffer.RemoveAt(0);
continue;//繼續下一次循環
}
循環推進校驗的方式值得借鑒。
帖子8:C#串口類SerialPort詳解
波特率
ReadTimeout
ReceivedBytesThreshold
sp.DtrEnable = true; //如果是RS232轉RS485,此句必須要,否則不能通訊
