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