M5側が途中で区切って文字列を送信するんだけど?
こうした悩みを解決します。
本記事はprintlnで改行される話ではないですよ。
printlnのlnは改行コードなのでprintlnで送信すると分割されるのは正常動作です。
詳細はデリミタとかCRLFとかでググってみてください。
送信バッファのサイズ超過
400文字超の文字列をBluetoothで送信しようとしたとき、300文字程度で毎回分割送信されることに気づきました。
300文字、100文字の計400文字送信になっていたのですが、送信先では一発目の300文字程度しか受信されず処理不良になっていたわけです。
これはバッファ絡みでしょうなあ…
なんて思いつつ、送信バッファを探してみることに。
組み込みやってると通信でつまずくことが多いので、経験が増えるにつれ知識も増える、これ組込あるあるですよね。
まあそれはいいとして、早速送信バッファを探しましょう。
バッファサイズ変更で解決!
送信バッファサイズを決めている変数…ありました!BluetoothSerial.cppに!!
const uint16_t SPP_TX_MAX = 330;
TXは送信の意味で、MAXが330…まさに私の躓いていた300文字前後にはまります。
試しにSPP_TX_MAX を330から500にしたところ、400文字を一発で送ることができました!
ってことで330文字以上の文字列を一斉送信したい場合は上記の数値を変更しましょう。
過剰にバッファサイズを設けるとROM容量を圧迫するんで、必要な分だけ確保しましょうね。
補足:UART通信について
BluetoothはUARTとよばれる非同期通信を行っています。
送信のTXD、受信のRXD、この2本を配線するだけです。
AとBの間をUART通信する場合、AのTXDをBのRXDに、BのTXDをAのRXDにつなげます、交差する感じですね。
それで、送信するときはまず送信バッファに文字列を格納して、マイコン側の都合でバッファに入れた文字列を相手先に送ります。
文字列の最後に\0を含めることで、文字列の区切りを判別しています。
今回の問題はバッファサイズ以上のデータを格納しようとしたので、マイコン(ESP32)側が、バッファオーバーフローする前に一旦全部送って、続きを別途送ってくれたということですね。
まとめ
M5stackで330文字以上の文字列を一斉送信できないのは送信バッファを超過してるから。
BluetoothSerial.cppのSPP_TX_MAX定数をいじりましょう。
コメント