一、串列埠連線的開啟與關閉
串列埠,即com口,在.net中使用serialport類進行操作。串列埠開啟與關閉,是涉及慢速硬體的io操作,頻繁開啟或關閉會影響整體處理速度,甚至導致開啟或關閉串列埠失敗。非特殊情況,串列埠一次性開啟後,在退出程式時關閉串列埠即可。在開啟串列埠前,可以設定一些常用的引數。常用的引數如下:
(2) 串列埠的接受/傳送快取區大小:readbuffersize/writebuffersize。
具體**如下:
1 // open com
2 _serialport = new serialport(com, baud);
3 if (_serialport.isopen) _serialport.close();
4 5 // set the read / write timeouts
6 _serialport.readtimeout = 500;
7 _serialport.writetimeout = 500;
8 9 // set read / write buffer size,the default of value is 1mb
10 _serialport.readbuffersize = 1024 * 1024;
11 _serialport.writebuffersize = 1024 * 1024;
12 13 _serialport.open();
14 15 // discard buffer
16 _serialport.discardinbuffer();
17 _serialport.discardoutbuffer();
需要注意的是超出緩衝區的部分會被直接丟棄。因此,如果需要使用串列埠傳送大檔案,那接收方和傳送方都需要將各自的緩衝區域設定的足夠大,以便能夠一次性儲存下大檔案的二進位制陣列。若條件限制,緩衝區域不能設定過大,那就需要在傳送大檔案的時候按照傳送緩衝區大小分包去傳送,接收方按順序把該陣列組合起來形成接受檔案的二進位制陣列。
二、串列埠傳送
serialport類傳送支援二進位制傳送與文字傳送,需要注意的是文字傳送時,需要知道轉換的規則,一般常用的是ascii、utf7、utf-8、unicode、utf32。具體**如下:
1 #region send
2 /// 3 /// 傳送訊息(byte陣列)
4 ///
5 ///
6 ///
7 ///
8 public void send(byte buffer, int offset, int count)
9
15 }
16 17 /// 18 /// 傳送訊息(字串)
19 ///
20 /// 字串編碼方式,具體方式見
21 ///
22 public void send(encoding encoding , string message)
23
30 }
31 #endregion
三、串列埠接受 串列埠接受需要注意,訊息接受與訊息處理要**分離。不能把流程處理的**放入資訊接受處,因為訊息處理或多或少會有耗時,這會造成當傳送方傳送過快時,接受方的接受緩衝區會快取多條訊息。我們可以把接受到的訊息放入佇列中,然後在外部執行緒中,嘗試去拿出該條訊息進行消費。採用 「生產-消費」模式。具體**如下:
1 #region receive
2 private void pushmessage()
3
16 };
17 }
18 19 /// 20 /// 獲取串列埠接受到的內容
21 ///
22 /// 取訊息的超時時間
23 /// 返回byte陣列
24 public byte trymessage(int millisecondstotimeout = -1)
25
30 31 if (_messagewaithandle.waitone(millisecondstotimeout))
32
37 }
38 return default;
39 }
40 #endregion
四、完整**與測試結果 串列埠工具類的完整**如下:
view code
測試**如下:
view code
使用串列埠工具測試如下,對於串列埠的接受如絲般順滑。當我們在訊息中增加測試延時後,就會發現當串列埠工具繼續快速傳送一段時間後關閉傳送,發現使用佇列後,依然沒有丟失一條來自傳送方的訊息。
五、串列埠工具編寫例項
通過以上對串列埠的了解,我們模仿串列埠工具進行程式設計,完成如下:
c 串列埠快取位元組數 C 串列埠連線的讀取與傳送
一 串列埠連線的開啟與關閉 串列埠,即com口,在.net中使用 serialport 類進行操作。串列埠開啟與關閉,是涉及慢速硬體的io操作,頻繁開啟或關閉會影響整體處理速度,甚至導致開啟或關閉串列埠失敗。非特殊情況,串列埠一次性開啟後,在退出程式時關閉串列埠即可。在開啟串列埠前,可以設定一些常用...
C 簡單的串列埠讀取
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...
C 串列埠通訊,串列埠的傳送與接收,獲取本機串列埠
serialport 串列埠類 1.引用命名空間 using system.io.ports 2.建立物件 serialport com new serialport 3.給串列埠埠與波特率屬性賦值 com.portname com4 com.baudrate 9600 4.開啟串列埠 com.op...