回答編集履歴

1

サンプルコード追加

2022/10/13 14:30

投稿

matukeso
matukeso

スコア1590

test CHANGED
@@ -1 +1,34 @@
1
1
  DataRecvedイベントに期待せず、専用スレッドとかで読み続けてみては?
2
+ Threadを使ってもいいし、
3
+
4
+ ```csharp
5
+ void ReadThreadProc(){
6
+ while( SerialPort.IsOpen) {
7
+ byte[] arr = new byte[1024];
8
+ int readlen = SerialPort.BaseStream.Read( arr, 0, arr.Length );
9
+ OnRead( arr, readlen);
10
+ }
11
+ }
12
+ ```
13
+ ReadAsyncとか使ってもいいし。
14
+ ```csharp
15
+ Task ReadAsync( byte[] buffer){
16
+ return SerialPort.BaseStream.ReadAsync(buffer, 0, buffer.Length).ContinueWith((Task<int> len) => OnRead(buffer, len.Result));
17
+ }
18
+ void OnRead(byte[] buffer, int len){
19
+ if( len > 0){
20
+ //なんか受信後処理をここに書く
21
+
22
+ ReadAsync(buffer); //受信処理が終わったので読み込み
23
+ }
24
+ }
25
+
26
+ //ダブルバッファリング
27
+ byte[] buffer1 = new byte[4096];
28
+ byte[] buffer2 = new byte[4096];
29
+ void start()
30
+ {
31
+ ReadAsync(buffer1);
32
+ ReadAsync(buffer2);
33
+ }
34
+ ```