質問編集履歴

3

ソースコードを更新致しました。

2017/07/21 02:32

投稿

GuielNo4
GuielNo4

スコア88

test CHANGED
File without changes
test CHANGED
@@ -20,48 +20,334 @@
20
20
 
21
21
  ```ここに言語を入力
22
22
 
23
- private Queue<byte> receivedDatas = new Queue<byte>();
24
-
25
- private int backup_count = 0;
23
+ Program.cs
26
-
24
+
27
- public void update()
25
+ class Program
28
26
 
29
27
  {
30
28
 
29
+ volatile static bool _keyReaded = false;
30
+
31
+ static void Main(string[] args)
32
+
33
+ {
34
+
35
+ ConvertFrame convertFrame = new ConvertFrame();
36
+
37
+ bool isFinish = false;
38
+
39
+ while (!isFinish)
40
+
41
+ {
42
+
43
+ convertFrame.update();
44
+
45
+ Console.WriteLine(convertFrame.listFrames.Count.ToString());
46
+
47
+ /// キー入力で終了します。
48
+
49
+ if (_keyReaded)
50
+
51
+ {
52
+
53
+ isFinish = true;
54
+
55
+ }
56
+
57
+ }
58
+
59
+ }
60
+
61
+ static void MonitoringKey(object userState)
62
+
63
+ {
64
+
65
+ ConsoleKeyInfo keyInfo = Console.ReadKey(true);
66
+
67
+ _keyReaded = true;
68
+
69
+ }
70
+
71
+ }
72
+
73
+
74
+
75
+ ConvertFrame.cs
76
+
77
+ class ConvertFrame
78
+
79
+ {
80
+
81
+ private Queue<byte> receivedDatas = new Queue<byte>();
82
+
83
+ private int backup_count = 0;
84
+
85
+
86
+
87
+ public List<byte[]> listFrames { get; private set; }
88
+
89
+
90
+
91
+ private Serial uart = new Serial();
92
+
93
+
94
+
95
+
96
+
97
+ public ConvertFrame()
98
+
99
+ {
100
+
101
+ listFrames = new List<byte[]>();
102
+
103
+ uart.Open("COM1", 115200);
104
+
105
+ }
106
+
107
+
108
+
109
+ public void update()
110
+
111
+ {
112
+
31
- Queue<byte> pickedup = new Queue<byte>();
113
+ Queue<byte> pickedup = new Queue<byte>();
32
-
114
+
33
- getData(ref pickedup);
115
+ uart.getData(ref pickedup);
34
-
116
+
35
- if ( pickedup.Count.Equal(0) )
117
+ if (pickedup.Count.Equals(0))
36
-
118
+
37
- {
119
+ {
120
+
121
+ return;
122
+
123
+ }
124
+
125
+ foreach( int index in Enumerable.Range(0, pickedup.Count ) )
126
+
127
+ {
128
+
129
+ receivedDatas.Enqueue( pickedup.Dequeue() );
130
+
131
+ }
132
+
133
+ if ( receivedDatas.Count.Equals(0) )
134
+
135
+ {
136
+
137
+ return;
138
+
139
+ }
140
+
141
+ backup_count = receivedDatas.Count; // --- (1)
142
+
143
+ byte head = receivedDatas.Peek(); //---- (2)
144
+
145
+
146
+
147
+ head = 16; /// ---- (A)
148
+
149
+
150
+
151
+ bool isExistDatas = true;
152
+
153
+ while( isExistDatas )
154
+
155
+ {
156
+
157
+ if ( receivedDatas.Count >= (int)head )
158
+
159
+ {
160
+
161
+ List<byte> frame = new List<byte>();
162
+
163
+ foreach (int index in Enumerable.Range(0, (int)head ))
164
+
165
+ {
166
+
167
+ frame.Add(receivedDatas.Dequeue()); // ---(3)
168
+
169
+ }
170
+
171
+ listFrames.Add( frame.ToArray() );
172
+
173
+ }
174
+
175
+ else
176
+
177
+ {
178
+
179
+ isExistDatas = false;
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+ }
188
+
189
+
190
+
191
+ Serial.cs
192
+
193
+ class Serial
194
+
195
+ {
196
+
197
+ private SerialPort targetPort;
198
+
199
+ private List<byte[]> receivedBytes = new List<byte[]>();
200
+
201
+ private byte[] pickedupBytes = new byte[4096];
202
+
203
+
204
+
205
+ public Serial()
206
+
207
+ {
208
+
209
+ }
210
+
211
+
212
+
213
+ public void Open(string namePort, int baudRate)
214
+
215
+ {
216
+
217
+ string PortName = namePort;
218
+
219
+ int BaudRate = baudRate;
220
+
221
+ Parity Parity = Parity.None;
222
+
223
+ int DataBits = 8;
224
+
225
+ StopBits StopBits = StopBits.One;
226
+
227
+ targetPort = new SerialPort(PortName, BaudRate, Parity, DataBits, StopBits);
228
+
229
+ targetPort.Handshake = System.IO.Ports.Handshake.None;
230
+
231
+ targetPort.ReadTimeout = 0;
232
+
233
+ targetPort.WriteTimeout = 1500;
234
+
235
+ targetPort.ReadBufferSize = 1024 * 12;
236
+
237
+ targetPort.WriteBufferSize = 1024 * 12;
238
+
239
+ targetPort.DataReceived += new SerialDataReceivedEventHandler(ReceivedHandler);
240
+
241
+ targetPort.Open();
242
+
243
+ }
244
+
245
+
246
+
247
+ public void Close()
248
+
249
+ {
250
+
251
+ targetPort.Close();
252
+
253
+ }
254
+
255
+
256
+
257
+ public bool getData(ref Queue<byte> pickedup)
258
+
259
+ {
260
+
261
+ lock (receivedBytes)
262
+
263
+ {
264
+
265
+ if (receivedBytes.Count.Equals(0))
266
+
267
+ {
268
+
269
+ return false;
270
+
271
+ }
272
+
273
+
274
+
275
+ foreach (byte[] array in receivedBytes)
276
+
277
+ {
278
+
279
+ foreach (byte data in array)
280
+
281
+ {
282
+
283
+ pickedup.Enqueue(data);
284
+
285
+ }
286
+
287
+ }
288
+
289
+ /// 引数に渡したのでクリアする。
290
+
291
+ receivedBytes.Clear();
292
+
293
+ }
294
+
295
+ return true;
296
+
297
+ }
298
+
299
+
300
+
301
+ private void ReceivedHandler(object sender, SerialDataReceivedEventArgs e)
302
+
303
+ {
304
+
305
+ int totalCount = 0;
306
+
307
+ try
308
+
309
+ {
310
+
311
+ totalCount = targetPort.Read(pickedupBytes, totalCount, pickedupBytes.Length);
312
+
313
+ }
314
+
315
+ catch (TimeoutException exception)
316
+
317
+ {
318
+
319
+ Console.WriteLine(exception);
320
+
321
+ Console.ReadKey();
322
+
323
+ }
324
+
325
+
326
+
327
+ /// 固定長サイズのピックアップバッファから、受信データ数の分だけ取り出しておく。
328
+
329
+ byte[] buffer = new byte[totalCount];
330
+
331
+ Array.Copy(pickedupBytes, 0, buffer, 0, totalCount);
332
+
333
+
334
+
335
+ lock (receivedBytes)
336
+
337
+ {
338
+
339
+ receivedBytes.Add(buffer);
340
+
341
+ }
38
342
 
39
343
  return;
40
344
 
41
345
  }
42
346
 
43
- foreach( int index in Enumerable.Range(0, pickedup.Count ) )
44
-
45
- {
46
-
47
- receivedDatas.Enqueue( pickedup.Dequeue() );
48
-
49
- }
50
-
51
- if ( receivedDatas.Count.Equal(0) )
52
-
53
- {
54
-
55
- return;
56
-
57
- }
58
-
59
- backup_count = receivedDatas.Count; --- (1)
60
-
61
- byte head = receivedDatas.Peek(); ---- (2)
62
-
63
347
  }
64
348
 
349
+
350
+
65
351
  ```
66
352
 
67
353
 
@@ -76,6 +362,26 @@
76
362
 
77
363
 
78
364
 
365
+ 追記:
366
+
367
+ 問題の発生する部分だけ抽出してコード全体を書き直しました。
368
+
369
+ 上記のコードを実際に走らせ、現象の再発を確認できしました。
370
+
371
+ ただ、今度は(3) で発生するようになりました。
372
+
373
+ このとき、backup_count = 0x36 , head = 0x06 なのですが、
374
+
375
+ 例外で Queue が空という内容でした。
376
+
377
+
378
+
379
+ また、(A)の部分ですが、head の値が大きい場合に問題が発生している可能性も考えて、
380
+
381
+ 16 byte に変更しています。だた、同じ例外が発生しました。
382
+
383
+
384
+
79
385
  アドバイスの程、宜しくお願い申し上げます。
80
386
 
81
387
 

2

コードにミスがありました。修正致します。

2017/07/21 02:32

投稿

GuielNo4
GuielNo4

スコア88

test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  }
42
42
 
43
- foreach( int index in Enumerable.Range(0, pickedup ) )
43
+ foreach( int index in Enumerable.Range(0, pickedup.Count ) )
44
44
 
45
45
  {
46
46
 

1

変数名のミスを修正しました。

2017/07/20 13:01

投稿

GuielNo4
GuielNo4

スコア88

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  backup_count = receivedDatas.Count; --- (1)
60
60
 
61
- byte head = receivedBuffer.Peek(); ---- (2)
61
+ byte head = receivedDatas.Peek(); ---- (2)
62
62
 
63
63
  }
64
64
 
@@ -80,6 +80,10 @@
80
80
 
81
81
 
82
82
 
83
+
84
+
85
+
86
+
83
87
  ###補足情報(言語/FW/ツール等のバージョンなど)
84
88
 
85
89
  visual studio 2013