質問編集履歴

6

情報の追加

2021/05/07 03:03

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
  //-------------------------------------------------------------------------------------
138
138
 
139
- 別ラインのシリアル処理も同じタスクで処理していたのですが、両方をメインループで処理するようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると
139
+ 通信処理をメインループで行うようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると問題があるのかもしれません。
140
140
 
141
141
  現象の原因はわからないのですが、もう少し様子を見て、問題なさそうならシングルタスクにして(ひとまず)解決にするのもアリかもしれません。
142
142
 
@@ -170,7 +170,7 @@
170
170
 
171
171
 
172
172
 
173
- // *** 両方コメントアウトしていると、減少が発生しない
173
+ // *** USE_UARTReadTask をコメントアウトしていると、減少が発生しない
174
174
 
175
175
  //#define USE_UARTReadTask
176
176
 

5

情報の追加

2021/05/07 03:03

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -125,3 +125,261 @@
125
125
  ![受信間隔](a6ba863ad36ab64dc8ce2fe417a2c5dc.png)
126
126
 
127
127
  およそ100ms強ほどの間隔で「送られてくるとき」「送られてこないとき」が切り替わり、「送られてくるとき」は最短15ms間隔ほどで数発送られてきます。
128
+
129
+
130
+
131
+
132
+
133
+ //-------------------------------------------------------------------------------------
134
+
135
+ // 以下再追記
136
+
137
+ //-------------------------------------------------------------------------------------
138
+
139
+ 別ラインのシリアル処理も同じタスクで処理していたのですが、両方をメインループで処理するようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると
140
+
141
+ 現象の原因はわからないのですが、もう少し様子を見て、問題なさそうならシングルタスクにして(ひとまず)解決にするのもアリかもしれません。
142
+
143
+
144
+
145
+ 該当部のみ書き出した、現象確認用のソースを作成しました。
146
+
147
+ ```C++
148
+
149
+ #include <Arduino.h>
150
+
151
+ #include "comm.h"
152
+
153
+ #include <rom/rtc.h>
154
+
155
+
156
+
157
+ TaskHandle_t TaskUSB = NULL;
158
+
159
+ TaskHandle_t TaskUART = NULL;
160
+
161
+ const UByte RX2PortNo = 16;
162
+
163
+ const UByte TX2PortNo = 17;
164
+
165
+
166
+
167
+ void USB_ReadTask(void* arg);
168
+
169
+ void UART_ReadTask(void* arg);
170
+
171
+
172
+
173
+ // *** 両方コメントアウトしていると、減少が発生しない
174
+
175
+ //#define USE_UARTReadTask
176
+
177
+ //#define USE_USBReadTask
178
+
179
+
180
+
181
+ void setup() {
182
+
183
+ // put your setup code here, to run once:
184
+
185
+ SetupIO();
186
+
187
+ Serial.begin(115200, SERIAL_8N1);
188
+
189
+ Serial2.begin(115200, SERIAL_8N1, RX2PortNo, TX2PortNo);
190
+
191
+ // Serial2.setTimeout(10); // 読み取りタイムオーバー時間の設定:readuntil系で必要。
192
+
193
+
194
+
195
+ #ifdef USE_UARTReadTask
196
+
197
+ xTaskCreatePinnedToCore(UART_ReadTask, "UART_ReadTask", 4096, NULL, 10, &TaskUART, 0);
198
+
199
+ #endif
200
+
201
+ #ifdef USE_USBReadTask
202
+
203
+ xTaskCreatePinnedToCore(USB_ReadTask, "USB_ReadTask", 4096, NULL, 10, &TaskUSB, 0);
204
+
205
+ #endif
206
+
207
+ }
208
+
209
+
210
+
211
+ void UART_ReadTask(void* arg)
212
+
213
+ {
214
+
215
+ while (1)
216
+
217
+ {
218
+
219
+ char tmp[64]; // ESP32シリアル通信用の受信バッファは64バイトまで格納することが出来る
220
+
221
+ size_t readBts = 0;
222
+
223
+
224
+
225
+ int len = Serial2.available();
226
+
227
+ if (len > 0)
228
+
229
+ {
230
+
231
+ if (len > 64) {len = 64;}
232
+
233
+ readBts = Serial2.readBytes(tmp, len);
234
+
235
+ if (readBts)
236
+
237
+ {
238
+
239
+ DEB_OUT("\tIF < RW: ");
240
+
241
+ for (int i=0; i<readBts; i++)
242
+
243
+ {
244
+
245
+ Serial.write(tmp[i]);
246
+
247
+ DEB_OUT("%02X ", tmp[i]);
248
+
249
+ }
250
+
251
+ DEB_OUT("\n");
252
+
253
+ }
254
+
255
+ }
256
+
257
+ vTaskDelay(1);
258
+
259
+ }
260
+
261
+ }
262
+
263
+
264
+
265
+ void USB_ReadTask(void* arg)
266
+
267
+ {
268
+
269
+ while (1)
270
+
271
+ {
272
+
273
+ int len = Serial.available();
274
+
275
+ if(len)
276
+
277
+ {
278
+
279
+ for(int i=0;i<len;i++)
280
+
281
+ {
282
+
283
+ int ch = Serial.read();
284
+
285
+ Serial2.write(ch);
286
+
287
+ }
288
+
289
+ }
290
+
291
+ vTaskDelay(1); // delay(1);
292
+
293
+ }
294
+
295
+ }
296
+
297
+
298
+
299
+ void loop() {
300
+
301
+ int len;
302
+
303
+ // put your main code here, to run repeatedly:
304
+
305
+ if (digitalRead(SW_RD_TRIG) == 0)
306
+
307
+ {
308
+
309
+ digitalWrite(EN_POWER, 0);
310
+
311
+ }
312
+
313
+ #ifndef USE_UARTReadTask
314
+
315
+ //-------------------------------------------------------------------------------
316
+
317
+ // UART_ReadTask
318
+
319
+ len = Serial2.available();
320
+
321
+ char tmp[64]; // ESP32シリアル通信用の受信バッファは64バイトまで格納することが出来る
322
+
323
+ if (len > 0)
324
+
325
+ {
326
+
327
+ if (len > 64) {len = 64;}
328
+
329
+ size_t readBts = Serial2.readBytes(tmp, len);
330
+
331
+ if (readBts)
332
+
333
+ {
334
+
335
+ for (int i=0; i<readBts; i++)
336
+
337
+ {
338
+
339
+ // while(Serial.availableForWrite() == 0);
340
+
341
+ Serial.write(tmp[i]);
342
+
343
+ }
344
+
345
+ DEB_OUT("\n");
346
+
347
+ }
348
+
349
+ }
350
+
351
+ #endif
352
+
353
+ #ifndef USE_USBReadTask
354
+
355
+ //-------------------------------------------------------------------------------
356
+
357
+ // USB_ReadTask
358
+
359
+ len = Serial.available();
360
+
361
+ if(len)
362
+
363
+ {
364
+
365
+ for(int i=0;i<len;i++)
366
+
367
+ {
368
+
369
+ int ch = Serial.read();
370
+
371
+ // while(Serial.availableForWrite() == 0);
372
+
373
+ Serial2.write(ch);
374
+
375
+ }
376
+
377
+ }
378
+
379
+ //-------------------------------------------------------------------------------
380
+
381
+ #endif
382
+
383
+ }
384
+
385
+ ```

4

情報の追記

2021/05/07 02:59

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -114,7 +114,7 @@
114
114
 
115
115
  ![イメージ説明](78f5a562fcf0c64a8f4c00ce849bfbbd.png)
116
116
 
117
- 02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
117
+ 02 をスタートコード、0D をエンドコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
118
118
 
119
119
  デバッグ出力自体はこのフォーマット全体を出力しています。
120
120
 

3

書式の改善、図の追加

2021/05/06 09:05

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,10 @@
98
98
 
99
99
  //-------------------------------------------------------------------------------------
100
100
 
101
+ // 以下追記
102
+
103
+ //-------------------------------------------------------------------------------------
104
+
101
105
  GW期間中、PCを触れる環境でなく、ご回答、ご指摘いただいていながらお返事が遅くなり申し訳ございません。
102
106
 
103
107
  デバッグ出力ですが、減少が起きた時のスクリーンショットが残っていました。
@@ -113,3 +117,11 @@
113
117
  02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
114
118
 
115
119
  デバッグ出力自体はこのフォーマット全体を出力しています。
120
+
121
+
122
+
123
+ これらのデータが、以下のような間隔で送られてきています(黄色の縦線一つが上図のデータ全部相当)
124
+
125
+ ![受信間隔](a6ba863ad36ab64dc8ce2fe417a2c5dc.png)
126
+
127
+ およそ100ms強ほどの間隔で「送られてくるとき」「送られてこないとき」が切り替わり、「送られてくるとき」は最短15ms間隔ほどで数発送られてきます。

2

情報の更新

2021/05/06 08:32

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -95,3 +95,21 @@
95
95
 
96
96
 
97
97
  ```
98
+
99
+ //-------------------------------------------------------------------------------------
100
+
101
+ GW期間中、PCを触れる環境でなく、ご回答、ご指摘いただいていながらお返事が遅くなり申し訳ございません。
102
+
103
+ デバッグ出力ですが、減少が起きた時のスクリーンショットが残っていました。
104
+
105
+ ![B7 50 の入れ替わり](7d0c0a9a1a7ead00972208dfee50e195.png)
106
+
107
+ 以下が、この入れ替わった時の通信ラインの波形です。
108
+
109
+ 入れ替わった時(上記 ID IS CHANGED を出力した時)に青いラインがハイになるようにして、直前の通信データを確認しています。
110
+
111
+ ![イメージ説明](78f5a562fcf0c64a8f4c00ce849bfbbd.png)
112
+
113
+ 02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
114
+
115
+ デバッグ出力自体はこのフォーマット全体を出力しています。

1

コードの書き漏れを追加

2021/05/06 08:12

投稿

WoodenHamlet
WoodenHamlet

スコア306

test CHANGED
File without changes
test CHANGED
@@ -35,6 +35,8 @@
35
35
  // ~~~ 略 ~~~
36
36
 
37
37
  Serial.begin(115200, SERIAL_8N1);
38
+
39
+ Serial2.begin(115200, UART_CONF, RX2PortNo, TX2PortNo);
38
40
 
39
41
  xTaskCreatePinnedToCore(UART_ReadTask, "UART_ReadTask", 4096, NULL, 10, &TaskUART, 0);
40
42