#M5StackではSoftwareSerialを使おう
M5Stack(私はM5Stic-Cを使いましたが)でのSoftwareSerialのすゝめです。
#背景
Arduinoでコード書けるM5Stackでは、そもそもハードウェアコントロールなシリアルポートが3個あって、困らないからわざわざプログラムリソースを使いそうなSoftwareSerialなんてどうなのって思うかもしれません。
しかしながら、少なくともArduinoベースでコード書いている場合、一度にある程度長いデータ長をUARTで受信した場合、困ったことが起こることにかが付くかと思います。
そう、なんか欠損するのです。
この現象はM5Stackの問題というよりもArduinoのほうにあるみたいで、リファレンスとしては64Byteのリングバッファが確保されているらしいものの、実際は16Byteくらいから怪しくなってます。
(本当のところはちょっと調べてませんが、実際32Byteくらいからちょこちょこ欠損しだして、40Byte超えてくると2/3くらいはまともに取れなくなりました。
#先に結論から
はい。
ここに至った経緯とか色々書きたいですが、自分の備忘録的にも、まず対応方法を記述します。
##EspSoftwareSerialのライブラリをインストール
まずはM5のESP32に提供されているSoftwareSerialのライブラリをインストールします。
(Arduino標準のでもできるかわかりませんが、私は何か間違えたのかダメでした)
Arduino IDE: スケッチ>ライブラリのインクルード>ライブラリ管理>
検索項目に ”EspSoftwareSerial”を入力すればでてくる
これをインストール。
(画像は既にインストールしたあとです)
##コードno追記箇所
#include <SoftwareSerial.h>
#define swrxPin 32
#define swtxPin 33
SoftwareSerial mySerial;
readBuf[64]; //64じゃなくても良いですが、十分に受信したい数値で
int read_cnt = 0;
void setup(){
pinMode(srxPin, INPUT);
pinMode(stxPin, OUTPUT);
mySerial.begin(9600, SWSERIAL_8N1, swrxPin, swtxPin , false, 256);
}
void loop(){
if(mySerial.available()){
readBuf[read_cnt] = mySerial.read();
reac_cnt++;
}
// あとは受信したいデータ長までのread_cntのカウントクリアとか、受信したreadBufの処理とか。
}
#SoftwareSerialのメリットとは
そうです、これが大事。
UART長いデータを受信するのが目的で、何故これでうまくいくかですが、
ハードウェアコントロールのSerialポートのバッファサイズを変えるにはArduino IDEのHerdwareSerial.hを書き換えないとならないとかとか、
またそれをやってもM5ではうまくいかなかったので、リングバッファを自由に設定できるSoftwareSerialならどうかと考えたわけです。
###SoftwareSerialでは、開始時に指定
mySerial.begin(9600, SWSERIAL_8N1, swrxPin, swtxPin , false, 256);
の最後の"256"がそのリングバッファの指定オプションです。
#デメリットは
それはもちろん、ハードウェア処理任せにならないので、何サイクルか捨てることになるかとおもいます。
しかしながら、M5StackのESP32Coreは240MHz動作していますから、実用上115200bps以下であればまず問題ないかなと思います。
それ以上のよりリッチな通信をするのであればもっと違った通信を使えばよいのかなと。
最後までありがとうございます。
Mahalo!