PR

M5stackシリアル通信時に文字列が分割送信される問題の対処法

M5stackシリアル通信時に文字列が分割送信される問題の対処法 組み込み機器

M5側が途中で区切って文字列を送信するんだけど?

こうした悩みを解決します。

本記事はprintlnで改行される話ではないですよ。

printlnのlnは改行コードなのでprintlnで送信すると分割されるのは正常動作です。

詳細はデリミタとかCRLFとかでググってみてください。

姫野秀徳

組み込みエンジニアとしてメーカー勤務10年。
第二種電工事士、基本情報技術者、Code.org認定教師。
microbitを用いた電子工作&プログラミング教室を開校。
組み込み開発の実際を発信するyoutube活動も行う。

無料で学べる組み込み開発オンラインスクールはじめました!
https://kumicla.tatepro.com

姫野秀徳をフォローする

送信バッファのサイズ超過

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定数をいじりましょう。

この内容が良いと思ったら、いいね💖を押して教えてください!

組みクラ – 組み込み開発を学び、未来を創るエンジニアへ
無料で学べる!組み込み開発の基礎から応用までをマスターできるオンラインスクール「組みクラ」

組み込みエンジニアは、あらゆる産業の基盤を支える重要な職業です。
私たちタテプロは、次世代の組み込みエンジニアを育成し、業界の競争力を高めるために活動しています。
あなたも、無料で学べる「組みクラ」で、組み込み開発のスキルをしっかり身につけ、キャリアを加速させましょう!
今すぐ学び始めて、将来の自分をステップアップさせる第一歩を踏み出しませんか?

\立プロとLINEで友だちになりませんか/
立プロと友だちになる
組み込み機器
シェアしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました