private void serialPortA1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ReadRU(serialPortA1, 1);
}
private void ReadRU(System.IO.Ports.SerialPort serial, int num)
{
var name = num.ToString();
string readString = serial.ReadLine(); ///發送用serial.WriteLine()
if (readString.Length > 20)
{
String R = readString.Split(',')[0].ToString();
String U = readString.Split(',')[1].ToString();
}
}
最近總結了串口(COM)讀寫操作的三種方式:
第1種方式是采用微軟在.NET2.0推出了一個串口控件,SerialPort類,但必須是.NET2.0才可以
第2種方式是用API寫串口通信,雖然難度高,但可以方便實現自己想要的各種功能
第3種方式是通過采用Visual Studio 6.0中原來的MSComm控件這是最簡單的,最方便的方法,但需要注冊
以下詳細分析了每種方式的使用方式,並提供相應例題下載:
A.第1種方式:
.NET 2.0提供了對串口通信功能的支持,在命名空間System.IO.Ports下找到SerialPort類,通過創建一個新的SerialPort對象,我們就可以在.NET程序中控制串口通訊的全過程。
(1).屬性介紹
進行串口通訊時,需要設置一些相關參數,可以通過設置SerialPort類的屬性來進行。
SerialPort屬性主要包括:
.PortName 串口名稱,COM1, COM2等。
.BaudRate 波特率,也就是串口通訊的速度,進行串口通訊的雙方其波特率需要相同,如果用PC連接其他非PC系統,一般地,波特率由非PC系統決定。
.Parity 奇偶校驗。可以選取枚舉Parity中的值
.DataBits 數據位
.StopBits 停止位,枚舉StopBits中的值
.Handshake 握手方式,也就是數據流控制方式,枚舉Handshake中的值
(2).打開與關閉串口
在創建一個SerialPort對象,設置串口屬性后,可以通過Open()方法打開串口。數據讀寫完成后,可以通過Close()方法關閉串口。
根據經驗,對於有些系統,在打開串口后,還需要將RtsEnable設置為True,這樣才能讀寫數據,否則不能正常讀寫數據。
(3).讀寫行數據
ReadLine()方法是阻塞的,直至遇到一個換行符后返回。在讀取數據時,如果一直沒有遇到換行符,那么在等待ReadTimeout時間后,拋出一個TimeoutException。默認情況下,ReadTimeout為InfiniteTimeout。這樣,ReadLine一直處於阻塞狀態,直至有新一行數據到達。
WriteLine()方法也是阻塞的,如果另一方不能及時接收數據,就會引起TimeoutException異常。
由於ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 進行串口通訊時,一般應該把讀寫操作交由其他線程處理,避免因為阻塞而導致程序不響應。
(4).讀寫字節或字符數據
對於字節或字符數據,用Read()方法來讀數據,該方法需要一個字節或字符數組作為參數來保存讀取的數據,結果返回實際讀取的字節或字符數。
寫數據使用Write()方法,該方法可以將字節數組、字符數據或字符串發送給另一方。
(5).事件
SerialPort提供了DataReceived事件。當有數據進入時,該事件被觸發。
該事件的觸發由操作系統決定,當有數據到達時,該事件在輔助線程中被觸發。輔助線程的優先級比較低,因此並不能確保每個字節的數據到達時,該事件都被觸發。