c 串列埠快取位元組數 C 串列埠連線的讀取與傳送

2021-10-16 15:14:21 字數 4119 閱讀 2517

一、串列埠連線的開啟與關閉

串列埠,即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...