質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%

Q&A

解決済

1回答

3406閲覧

ESP32+Aruduinoでタイムアウト付き受信

omikuji-iot

総合スコア48

0グッド

0クリップ

投稿2021/03/30 07:41

前提・実現したいこと

ESP32のシリアル(UART)タイムアウト付き受信をしたい。

発生している問題・エラーメッセージ

下記のコードで試しに通信相手を接続せずに試しました。
「setTimeout」関数でタイムアウトを200msにしていますが
数十秒、場合によっては数分、「readStringUntil」関数を抜けません。

なにか考えられることはないでしょうか?

該当のソースコード

Serial2.begin(38400);
Serial2.setTimeout(200);
String str = Serial2.readStringUntil('\n');

試したこと

「readStringUntil」関数をコメントアウトすると処理の待ちが出ません。
このことから、タイムアウトが設定した通りになってないと思っています。

補足情報(FW/ツールのバージョンなど)

・windows10 64bit
・IDE:PlatoFormIO(Core 5.1.1·Home 3.3.4)
・ボード設定:M5Stack Core ESP32

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試してみました。

Arduino

1#include <M5Stack.h> 2 3void setup() { 4 // put your setup code here, to run once: 5 m5.begin(); 6 Serial2.begin(38400); 7 Serial2.setTimeout(200); 8} 9 10void loop() { 11 // put your main code here, to run repeatedly: 12 String a=Serial2.readStringUntil('\n'); 13 Serial.println(millis()); 14}

では、ちゃんと200msでタイムアウトしているようです。
症状の出るミニマムコードを提示できますか?

ライブラリは1.0.6です (あぁ、issueまだやってなかった)


あ、もしかして...
上記はSerial2は無入力で試したのですが、
HardwareSerialはStreamを継承していて、

Arduino

1String Stream::readStringUntil(char terminator) 2{ 3 String ret; 4 int c = timedRead(); 5 while(c >= 0 && c != terminator) { 6 ret += (char) c; 7 c = timedRead(); 8 } 9 return ret; 10}

Arduino

1int Stream::timedRead() 2{ 3 int c; 4 _startMillis = millis(); 5 do { 6 c = read(); 7 if(c >= 0) { 8 return c; 9 } 10 } while(millis() - _startMillis < _timeout); 11 return -1; // -1 indicates timeout 12}

だから、データが流れ込んでいる限りreadStringUntil()はタイムアウトしないのでは?

投稿2021/03/30 08:38

編集2021/03/30 08:43
thkana

総合スコア7733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omikuji-iot

2021/03/30 23:10

ご回答ありがとうございます。 「readStringUntil」の直前で「setTimeout」を呼んでいたのですが それを示していただいたコードに近づけようと 「begin」の直後で呼ぶようにしたところ、症状が改善されました。 なぜなのかは分かりませんが。。
thkana

2021/03/30 23:20

回答の内容についてはご理解頂いたのでしょうか? readStringUntilがタイムアウトになる条件はread単体のタイムアウトなので、'\n'以外のデータであっても200ms以内に続々とデータが送られてくる場合、readStringUntilはタイムアウトしない、ということなのですが。
omikuji-iot

2021/03/31 23:52

理解しました。 該当のUARTが無接続なので不安定になって継続的に入力しているのかも知れませんね。 プルアップ抵抗を入れるなどして確認してみます。
omikuji-iot

2021/04/01 02:01

検証しました。 質問の環境に戻して、UARTに10kΩのプルアップ抵抗を入れたところ現象が収まりました。 受信ポートの電圧が不安定でStreamに何か入り続けていたようです。 たまに安定したときに処理を抜けていたのかも知れません。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問