ESP32-S3でシリアル通信してみたら、あれ、シリアルモニタに文字が出ないんだけど...動いてない?このボード息してないの?普通に使えてたはずなんだけど。
三年ほど前に秋月電子から購入したものです。現在はこのバージョンではなく、後継品に代わっているようです。
Windows ターミナルで esptool flash_idと打ち込んでみるとこうなります。
ボードに問題はなさそう。さて、どうしたものか。ネットに情報がありますが、よくわからない。最もシンプルな例で試してみます。
void setup() {
Serial.begin(115200);
Serial.println("Hello World!");
pinMode(4, OUTPUT);
analogWrite(4, 200); // LED(4) ON
}
void loop(){;}
LED(4)は点灯しますが、"Hello World!"が表示されません。ふと気付きました。いつも使用しているArduino IDE 2.3.6のデフォルトなのか
ツール -> USB CDC On Boot:"Enabled"
となっており、これが理由でした。Disabledにしてやれば無事に動きます。
ついでに、以前の投稿と被るのですが改めて自分のメモとして、「シリアル通信」の「文字列受信」について書き留めておきます。
UNO、ESP32などに文字列を渡すとき、serial.readStringが便利です。そのとき、大きく分けて2つの仕方があると思います。
一つはhttps://rabbitprogram.com/archives/1325
に紹介されている
//参考サイト:http://ch.nicovideo.jp/yugata/blomaga/ar1177727
void setup() {
Serial.begin(115200);
}
int i = 0;
void loop() {
if (Serial.available() > 0) {
String str = Serial.readStringUntil(';'); //「;」を検出したら終了
// ';'でなくても動作する模様。単なる改行でも認識。
//ここは、シリアル受信したときに実行する
Serial.printf("Input string : %s", str);
str = "";
}
//ここは、何もシリアル受信していないときに実行する
Serial.printf("loop %d\n\r", i++);
delay(1000);
}
の方法。これは、シリアル受信が無くても1秒ごとにloop回数をカウントされ、動き続けていることがわかります。
2つ目は私がよく使う次の方法です。
void setup() {
Serial.begin(115200);
}
int i = 0;
void loop() {
String str="";
while( (str=Serial.readString()) == 0)
{
Serial.printf("Nothing %d\n\r",i++);// wait timeout.
}
i = 0;
str.trim(); // remove any \r \n whitespace at the end of the String
Serial.printf("Input String : %s\n\r",str);
delay(1000);
}
こちらはシリアル受信を待ち続け「while loop」しており、そのあとのコードは実行されません。受信すると次に進み「i = 0」にリセット、入力された文字列が表示されたりします。
どちらも「loop」することに違いはありませんが、目的に応じて使い分けられると思います。昔のシングルタスクPCにおけるコマンドプロンプトのような動作が後者でしょうか。また一つ困ったことが分かりました。単一のキーを連打して入力すると正しく読み取ってくれません。普通このような文字列入力はしないと思いますが。
最後までお付き合いいただきありがとうございました。


