Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

RaspberryPiとArduinoとの通信がうまくいかないときはハードウェアフロー制御をOFFにするとうまくいくケースがある

RaspberryPiとArduinoとの通信がうまくいかないトラブルがありました。
アレコレ試したところ、ハードウェアフロー制御をOFFにするとうまくいくケースがあったのでメモを。
多分、Debian系OSとUSBシリアル経由のRTS/CTSがうまく動いてない外部機器……という関係と一般化できそう。

実際のところ

RaspberryPi 4B+の USB3.0ポートにM5stackのUSB-C経由でのUSBシリアル通信で、ArduinoIDE越しなら通信するのにminicomでは全くウンともスンとも言わない問題にぶち当たりました。
当該デバイスは遠隔地にあったのでプローブを当てることも叶わず。
しばらく作業をして、そういえばM5stackのUSB周りで何か癖があるらしいという情報を思い出し、関連しそうなワードで検索を続けたところ、ハードウェアフロー制御の関係に行き当たりました。

用語集で

ハードウェアフロー制御 (hardware flow control)
通常の信号線とは別にフロー制御専用の信号線を用意し、これを使って通信を制御する方式をハードウェアフロー制御という。制御専用の信号線が必要なため設計は複雑になるものの、送受信するデータに制御データを埋め込まずに済むためデータ転送の効率がよい。コンピュータ本体と周辺機器間の接続など、専用のケーブルや通信路で直に繋がれた機器間の通信で用いられる。

フロー制御(フローコントロール)とは - IT用語辞典 e-Wordsより

とあるように、専用の制御用線を用意して通信するわけですが……Arduino側でCTS/RTSが正常に動いてなければ、PC側でも認識しませんよね、そりゃ。

今回のケースでは、ハードウェア制御に由来する問題でアタリだったようで、
Minicomなら、「Ctrl+A O」で設定を変更できるので、そこでハードウェアフローを切って再開したところ動きました。

sttyの場合は相手機器の状態にもよりますが上記minicomの対応で動いたようならCTS、DTR、RTSを全部切っちゃうのが荒治療ぽいですが対処方なんかなと。

$ stty -cdxon -ctsxon -dtrxoff -rtsxoff	 ...