一、串列埠連線的開啟與關閉
串列埠,即com口,在.net中使用 serialport 類進行操作。串列埠開啟與關閉,是涉及慢速硬體的io操作,頻繁開啟或關閉會影響整體處理速度,甚至導致開啟或關閉串列埠失敗。非特殊情況,串列埠一次性開啟後,在退出程式時關閉串列埠即可。在開啟串列埠前,可以設定一些常用的引數。常用的引數如下:
(2) 串列埠的接受/傳送快取區大小:readbuffersize/writebuffersize。
具體**如下:
1 //open com
2 _serialport = newserialport(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();
需要注意的是超出緩衝區的部分會被直接丟棄。因此,如果需要使用串列埠傳送大檔案,那接收方和傳送方都需要將各自的緩衝區域設定的足夠大,以便能夠一次性儲存下大檔案的二進位制陣列。若條件限制,緩衝區域不能設定過大,那就需要在傳送大檔案的時候按照傳送緩衝區大小分包去傳送,接收方按順序把該陣列組合起來形成接受檔案的二進位制陣列。
二、串列埠傳送
串列埠傳送支援二進位制傳送與文字傳送,需要注意的是文字傳送時,需要知道轉換的規則,一般常用的是ascii、utf7、utf-8、unicode、utf32。具體**如下:
1 #region send
2 ///
3 ///傳送訊息(byte陣列)4 ///
5 ///
6 ///
7 ///
8 public void send(byte buffer, int offset, intcount)9 15 }16
17 ///
18 ///傳送訊息(字串)19 ///
20 /// 字串編碼方式,具體方式見
21 ///
22 public void send(encoding encoding , stringmessage)23 30 }31 #endregion
三、串列埠接受
串列埠接受需要注意,訊息接受與訊息處理要**分離。不能把流程處理的**放入資訊接受處,因為訊息處理或多或少會有耗時,這會造成當傳送方傳送過快時,接受方的接受緩衝區會快取多條訊息。我們可以把接受到的訊息放入佇列中,然後在外部執行緒中,嘗試去拿出該條訊息進行消費。採用 「生產-消費」模式。具體**如下:
1 #region receive
2 private voidpushmessage()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
四、完整**與測試結果
串列埠工具類的完整**如下:
1 usingsystem;2 usingsystem.collections.concurrent;3 usingsystem.collections.generic;4 usingsystem.io.ports;5 usingsystem.linq;6 usingsystem.runtime.serialization;7 usingsystem.text;8 usingsystem.threading;9 usingsystem.threading.tasks;10
11 namespaceserialportdemo12 24 public intsendcount25 28 public sserialport(string com, intbaud )29 43
44 private void opencom(string com, intbaud)45 64
66 #region static
67 ///
68 ///獲取當前計算機的串列埠名的陣列69 ///
70 ///
71 public static string getportnames()72 75 #endregion
77 #region receive
78 private voidpushmessage()79 92 };93 }94
95 ///
96 ///獲取串列埠接受到的內容97 ///
98 /// 取訊息的超時時間
99 /// 返回byte陣列
100 public byte trymessage(int millisecondstotimeout = -1)101 106
107 if(_messagewaithandle.waitone(millisecondstotimeout))108 113 }114 return default;115 }116 #endregion
119 #region send
120 ///
121 ///傳送訊息(byte陣列)122 ///
123 ///
124 ///
125 ///
126 public void send(byte buffer, int offset, intcount)127 133 }134
135 ///
136 ///傳送訊息(字串)137 ///
138 /// 字串編碼方式,具體方式見
139 ///
140 public void send(encoding encoding , stringmessage)141 148 }149 #endregion
151 ///
152 ///清空接受/傳送總數統計153 ///
154 public voidclearcount()155 161 }162
163 ///
164 ///關閉串列埠165 ///
166 public voidclose()167 170 }171 }
view code
測試**如下:
1 classprogram2 ");6
7 console.write("請輸入需要開啟的串列埠:");8 string port =console.readline();9 sserialport com = new sserialport(port, 57600);10 console.writeline($"串列埠 開啟成功...");11
12 console.write("請輸入需要開啟的串列埠傳送的訊息:");13 string text =console.readline();14
15 while (true)16 ");19 var message =com.trymessage();20 if (message != null)21 ");23
24 test:從新增延時可以測試到,接受訊息和處理訊息必須分不同執行緒處理。因為對於訊息的處理或多或少都需要耗時,這樣容易造成訊息處理不及時。而新增到佇列後,我們可以隨時取出處理
25 26 }27 console.writeline($"總共接受 ");28 }29
31 console.readkey();32 }33 }
view code
使用串列埠工具測試如下,對於串列埠的接受如絲般順滑。當我們在訊息中增加測試延時後,就會發現當串列埠工具繼續快速傳送一段時間後關閉傳送,發現使用佇列後,依然沒有丟失一條來自傳送方的訊息。
C 位元組陣列操作
合併位元組陣列 public static byte combinebytearray byte bytearra return ams.toarray 位元組陣列擷取 32位 public unsafe static byte subbytearray byte src,int begin,int...
C 位元組陣列擷取
c 位元組陣列擷取 如 byte bt new byte 方法一 擷取位數規則 1 擷取2位長度的位元組陣列 用bitconverter.toint16 例如,從第2位開始擷取2個位元組則 bitconverter.toint16 bt,2 2 擷取4位長度的位元組陣列 用bitconverter....
STM32 HAL庫串列埠傳送多位元組資料
串列埠傳送16位元組資料 int16 t motorencoder uint8 t low,high high uint8 t motorencoder 8 low uint8 t motorencoder 0xff hal uart transmit huart1 low,1,0xff hal u...