M5Stackとシリアル通信
M5StackはESP32というWiFiもBluetoothも使える優れモノチップが搭載されている為、「通信はネット・リモート経由で!Bluetoothで!」といったところに走ってしまいがちですが、結局バッテリーが小さい等の都合で母体に繋げて動作させる場合は、**「USB(給電+シリアル通信)」**って解もあっていいと思います。
といっても、M5Stackでシリアル通信って当たり前すぎて逆に詳しく書かれていないのかなと感じまして、こちらに残しておきたいと思います。
シリアル通信確認方法
通信方法
では、Arduinoでは良く書かれている手法(のちょっとアレンジを加えたやり方)をご紹介。
その前にArduinoと異なるポイントとして
-
Serial.begin();
は書かない。(既にライブラリ側で開いているのでエラーになります) - Stringオブジェクトの
replace()
関数等は戻り値ではなくそのものの値が反映される。
注意点でした。
送信
送信は簡単です。
// text =
Serial.println(text);
text
に文字列をセットします。
受信
受信は少し工夫しています。待ち受けないといけないのでloop内に実装します。
if (Serial.available()) {
String text = Serial.readStringUntil(0x0a);
if (text.length() > 0 && text.startsWith("*")) {
text.trim();
text.replace("*","");
// = text
}
}
改行(LF)
のキャラクターまで受信を待つ仕組みになっています。
もう一つのやり方(readString)だと、1行につき文字列が送られるのを1秒待つことになります。
1秒の数字は変えられますが、じゃあどこまで減らせるかと考えると、終了文字列を決めてその文字列がやってきたら即次の処理に移せた方が理想かと思われます。
"*"
の文字列で始まったときの処理はloop関数内にて待機させる際に、重複して読み込まれてしまう可能性があります。重複2回目のデータは不完全な文字列となるので、リードエラーを防ぐ為に実施しています。
という事で、結果シリアル通信でPCから送信する(M5Stack側で受信される)データは
*blahblahblah<改行>
という感じになります。結果(text
の値)はblahblahblah
がセットされますが、上記の例ではもちろんデータ内に*
の文字列が使えなくなります。
使いたい場合はプログラムの文字列を別なものに変えると良いでしょう。
実際に通信してみて
- 1度に通信できる文字列は詳しく計測していませんが、150~160文字ぐらいの様です。
- 上記の手法だと、待ち受け時間が短縮される為、実装処理に時間をかけなければ、高速にデータやり取りができると思います。