teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

情報の追加

2021/05/07 03:03

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -67,7 +67,7 @@
67
67
  //-------------------------------------------------------------------------------------
68
68
  // 以下再追記
69
69
  //-------------------------------------------------------------------------------------
70
- 別ラインのシリアル処理も同じタスクで処理していたのですが、両方をメインループで処理するようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると
70
+ 通信処理をメインループで行うようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると問題があるのかもしれません。
71
71
  現象の原因はわからないのですが、もう少し様子を見て、問題なさそうならシングルタスクにして(ひとまず)解決にするのもアリかもしれません。
72
72
 
73
73
  該当部のみ書き出した、現象確認用のソースを作成しました。
@@ -84,7 +84,7 @@
84
84
  void USB_ReadTask(void* arg);
85
85
  void UART_ReadTask(void* arg);
86
86
 
87
- // *** 両方コメントアウトしていると、減少が発生しない
87
+ // *** USE_UARTReadTask をコメントアウトしていると、減少が発生しない
88
88
  //#define USE_UARTReadTask
89
89
  //#define USE_USBReadTask
90
90
 

5

情報の追加

2021/05/07 03:03

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -61,4 +61,133 @@
61
61
 
62
62
  これらのデータが、以下のような間隔で送られてきています(黄色の縦線一つが上図のデータ全部相当)
63
63
  ![受信間隔](a6ba863ad36ab64dc8ce2fe417a2c5dc.png)
64
- およそ100ms強ほどの間隔で「送られてくるとき」「送られてこないとき」が切り替わり、「送られてくるとき」は最短15ms間隔ほどで数発送られてきます。
64
+ およそ100ms強ほどの間隔で「送られてくるとき」「送られてこないとき」が切り替わり、「送られてくるとき」は最短15ms間隔ほどで数発送られてきます。
65
+
66
+
67
+ //-------------------------------------------------------------------------------------
68
+ // 以下再追記
69
+ //-------------------------------------------------------------------------------------
70
+ 別ラインのシリアル処理も同じタスクで処理していたのですが、両方をメインループで処理するようにすると、現象が起きなくなりました。シリアル通信をマルチタスクですると
71
+ 現象の原因はわからないのですが、もう少し様子を見て、問題なさそうならシングルタスクにして(ひとまず)解決にするのもアリかもしれません。
72
+
73
+ 該当部のみ書き出した、現象確認用のソースを作成しました。
74
+ ```C++
75
+ #include <Arduino.h>
76
+ #include "comm.h"
77
+ #include <rom/rtc.h>
78
+
79
+ TaskHandle_t TaskUSB = NULL;
80
+ TaskHandle_t TaskUART = NULL;
81
+ const UByte RX2PortNo = 16;
82
+ const UByte TX2PortNo = 17;
83
+
84
+ void USB_ReadTask(void* arg);
85
+ void UART_ReadTask(void* arg);
86
+
87
+ // *** 両方コメントアウトしていると、減少が発生しない
88
+ //#define USE_UARTReadTask
89
+ //#define USE_USBReadTask
90
+
91
+ void setup() {
92
+ // put your setup code here, to run once:
93
+ SetupIO();
94
+ Serial.begin(115200, SERIAL_8N1);
95
+ Serial2.begin(115200, SERIAL_8N1, RX2PortNo, TX2PortNo);
96
+ // Serial2.setTimeout(10); // 読み取りタイムオーバー時間の設定:readuntil系で必要。
97
+
98
+ #ifdef USE_UARTReadTask
99
+ xTaskCreatePinnedToCore(UART_ReadTask, "UART_ReadTask", 4096, NULL, 10, &TaskUART, 0);
100
+ #endif
101
+ #ifdef USE_USBReadTask
102
+ xTaskCreatePinnedToCore(USB_ReadTask, "USB_ReadTask", 4096, NULL, 10, &TaskUSB, 0);
103
+ #endif
104
+ }
105
+
106
+ void UART_ReadTask(void* arg)
107
+ {
108
+ while (1)
109
+ {
110
+ char tmp[64]; // ESP32シリアル通信用の受信バッファは64バイトまで格納することが出来る
111
+ size_t readBts = 0;
112
+
113
+ int len = Serial2.available();
114
+ if (len > 0)
115
+ {
116
+ if (len > 64) {len = 64;}
117
+ readBts = Serial2.readBytes(tmp, len);
118
+ if (readBts)
119
+ {
120
+ DEB_OUT("\tIF < RW: ");
121
+ for (int i=0; i<readBts; i++)
122
+ {
123
+ Serial.write(tmp[i]);
124
+ DEB_OUT("%02X ", tmp[i]);
125
+ }
126
+ DEB_OUT("\n");
127
+ }
128
+ }
129
+ vTaskDelay(1);
130
+ }
131
+ }
132
+
133
+ void USB_ReadTask(void* arg)
134
+ {
135
+ while (1)
136
+ {
137
+ int len = Serial.available();
138
+ if(len)
139
+ {
140
+ for(int i=0;i<len;i++)
141
+ {
142
+ int ch = Serial.read();
143
+ Serial2.write(ch);
144
+ }
145
+ }
146
+ vTaskDelay(1); // delay(1);
147
+ }
148
+ }
149
+
150
+ void loop() {
151
+ int len;
152
+ // put your main code here, to run repeatedly:
153
+ if (digitalRead(SW_RD_TRIG) == 0)
154
+ {
155
+ digitalWrite(EN_POWER, 0);
156
+ }
157
+ #ifndef USE_UARTReadTask
158
+ //-------------------------------------------------------------------------------
159
+ // UART_ReadTask
160
+ len = Serial2.available();
161
+ char tmp[64]; // ESP32シリアル通信用の受信バッファは64バイトまで格納することが出来る
162
+ if (len > 0)
163
+ {
164
+ if (len > 64) {len = 64;}
165
+ size_t readBts = Serial2.readBytes(tmp, len);
166
+ if (readBts)
167
+ {
168
+ for (int i=0; i<readBts; i++)
169
+ {
170
+ // while(Serial.availableForWrite() == 0);
171
+ Serial.write(tmp[i]);
172
+ }
173
+ DEB_OUT("\n");
174
+ }
175
+ }
176
+ #endif
177
+ #ifndef USE_USBReadTask
178
+ //-------------------------------------------------------------------------------
179
+ // USB_ReadTask
180
+ len = Serial.available();
181
+ if(len)
182
+ {
183
+ for(int i=0;i<len;i++)
184
+ {
185
+ int ch = Serial.read();
186
+ // while(Serial.availableForWrite() == 0);
187
+ Serial2.write(ch);
188
+ }
189
+ }
190
+ //-------------------------------------------------------------------------------
191
+ #endif
192
+ }
193
+ ```

4

情報の追記

2021/05/07 02:59

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -56,7 +56,7 @@
56
56
  以下が、この入れ替わった時の通信ラインの波形です。
57
57
  入れ替わった時(上記 ID IS CHANGED を出力した時)に青いラインがハイになるようにして、直前の通信データを確認しています。
58
58
  ![イメージ説明](78f5a562fcf0c64a8f4c00ce849bfbbd.png)
59
- 02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
59
+ 02 をスタートコード、0D をエンドコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
60
60
  デバッグ出力自体はこのフォーマット全体を出力しています。
61
61
 
62
62
  これらのデータが、以下のような間隔で送られてきています(黄色の縦線一つが上図のデータ全部相当)

3

書式の改善、図の追加

2021/05/06 09:05

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -48,6 +48,8 @@
48
48
 
49
49
  ```
50
50
  //-------------------------------------------------------------------------------------
51
+ // 以下追記
52
+ //-------------------------------------------------------------------------------------
51
53
  GW期間中、PCを触れる環境でなく、ご回答、ご指摘いただいていながらお返事が遅くなり申し訳ございません。
52
54
  デバッグ出力ですが、減少が起きた時のスクリーンショットが残っていました。
53
55
  ![B7 50 の入れ替わり](7d0c0a9a1a7ead00972208dfee50e195.png)
@@ -55,4 +57,8 @@
55
57
  入れ替わった時(上記 ID IS CHANGED を出力した時)に青いラインがハイになるようにして、直前の通信データを確認しています。
56
58
  ![イメージ説明](78f5a562fcf0c64a8f4c00ce849bfbbd.png)
57
59
  02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
58
- デバッグ出力自体はこのフォーマット全体を出力しています。
60
+ デバッグ出力自体はこのフォーマット全体を出力しています。
61
+
62
+ これらのデータが、以下のような間隔で送られてきています(黄色の縦線一つが上図のデータ全部相当)
63
+ ![受信間隔](a6ba863ad36ab64dc8ce2fe417a2c5dc.png)
64
+ およそ100ms強ほどの間隔で「送られてくるとき」「送られてこないとき」が切り替わり、「送られてくるとき」は最短15ms間隔ほどで数発送られてきます。

2

情報の更新

2021/05/06 08:32

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -46,4 +46,13 @@
46
46
  }
47
47
  }
48
48
 
49
- ```
49
+ ```
50
+ //-------------------------------------------------------------------------------------
51
+ GW期間中、PCを触れる環境でなく、ご回答、ご指摘いただいていながらお返事が遅くなり申し訳ございません。
52
+ デバッグ出力ですが、減少が起きた時のスクリーンショットが残っていました。
53
+ ![B7 50 の入れ替わり](7d0c0a9a1a7ead00972208dfee50e195.png)
54
+ 以下が、この入れ替わった時の通信ラインの波形です。
55
+ 入れ替わった時(上記 ID IS CHANGED を出力した時)に青いラインがハイになるようにして、直前の通信データを確認しています。
56
+ ![イメージ説明](78f5a562fcf0c64a8f4c00ce849bfbbd.png)
57
+ 02 をスタートコードとしたフォーマットで、赤枠内のデータを収集するような動作を行っています。
58
+ デバッグ出力自体はこのフォーマット全体を出力しています。

1

コードの書き漏れを追加

2021/05/06 08:12

投稿

WoodenHamlet
WoodenHamlet

スコア306

title CHANGED
File without changes
body CHANGED
@@ -17,6 +17,7 @@
17
17
  {
18
18
  // ~~~ 略 ~~~
19
19
  Serial.begin(115200, SERIAL_8N1);
20
+ Serial2.begin(115200, UART_CONF, RX2PortNo, TX2PortNo);
20
21
  xTaskCreatePinnedToCore(UART_ReadTask, "UART_ReadTask", 4096, NULL, 10, &TaskUART, 0);
21
22
  // ~~~ 略 ~~~
22
23