2台のマイコンのシリアル通信で文字化けする (GNDループ)
M5Stamp S3Aを2台使ってシリアル通信を試したところ、通信内容が化けるという事象に遭遇しました。
基本的なことですが、これまで何となく上手くいっていたり、もしかしたらエラー起きていたけど気が付かなかったということで、今更ながらの学習になったのでメモです。
発生事象
Stamp S3AのTXピンとRXピンを繋ぎ、RXピン側のS3AからPCへ受信内容をUSB-UARTで出力しています。
TXピン側は常に"UART!\n"を送信しています。
ボーレートを遅くしてみたりしましたが、解消せずでした。
この時のPC側の受信ログとしては、
12:37:49.090 -> UP*Uj 12:37:49.156 -> UP*Uj 12:37:49.189 -> UP*Uj 12:37:49.254 -> UP*Uj 12:37:49.286 -> UP*Uj
といったものや、
12:45:46.549 -> IQ� 12:45:46.582 -> IQ� 12:45:46.646 -> IQ� 12:45:46.680 -> UIQ� 12:45:46.746 -> UIQ� 12:45:46.779 -> UIQ� 12:45:46.844 -> UP*Uj 12:45:46.878 -> UART! 12:45:46.944 -> UP*Uj 12:45:46.976 -> IQ�
といったものが出てきました。

ChatGPTに聞いてる
先日4oから5に進化したということで、試しに聞いてみました。
以下はChatGPT 5に、はてなブログ用にマークダウン記法で出力してもらった内容です。
ESP32-S3A同士をUART接続したらGND接続で通信が不安定になる原因と対策
原因:グラウンドループ
2台のESP32-S3AをUSBでPCに接続すると、それぞれのGNDはPC側ですでに共有されています。
この状態でS3A同士のGNDもジャンパで直結すると、以下のような閉ループ(グラウンドループ)が発生します。
ループに スイッチング電源のリップルやPC間の電位差 が流れ、UART信号の基準電位が揺れて通信が不安定になります。

簡単な確認方法
GND同士をつないだ状態と外した状態で通信の安定性を比較。
2台のPC(またはポート)間でGND電位差をテスターで測定。
数十 mV〜数百 mVの直流差やACノイズが見える場合あり。
対策(優先順)
1. アイソレーション
- UART間にデジタルアイソレータ(例:
ADuM1201/Si86xx)やRS-485等の差動+アイソレータを挟む。 - またはUSBアイソレータを片側に入れて電気的に分離する。
2. 単一基準にそろえる(ループを作らない)
- 2台を同じPC・同じUSBハブに挿す。
- 一方のUSBのVBUS(5V)をカット、またはデータ専用USBケーブルで電源の回り込みを防ぐ。
- GND接続は一点接地にし、USB経由とジャンパ経由の二重経路を作らない。
- 同じPCの場合、UARTのGNDジャンパは省略可能(TX/RXのみクロス接続)。
3. 配線と保護
- GNDジャンパを使う場合は短く太く。
- TX/RXには33〜100Ω程度の直列抵抗を入れてリンギングやグランドバウンスを軽減。
- 長いUSBケーブルやセルフパワー/バスパワー混在を避ける。
4. プロトコル側の耐性
- UARTボーレートを下げる(例: 115200 → 57600 / 38400)。
- 必要に応じて物理層を差動(RS-485)に変更。
まとめ
既にUSBで共有されているGNDに、もう1本のGND線を足すとグラウンドループが発生し、ノイズ電流がUART通信に悪影響を与えます。
解決策は以下のいずれかです。
- GNDジャンパを外す(同一PC・同一ハブなら不要)
- アイソレーションを入れる
マイコン間のGNDを外す
それなりに良さそうな回答が出たようです。
上記の2にある対策として、GNDを外したところ正常に受信できました。
13:00:41.638 -> UART! 13:00:41.671 -> UART! 13:00:41.737 -> UART! 13:00:41.772 -> UART! 13:00:41.838 -> UART!
マイコンのGND間には40mV程度の電位差があり、確かにChatGPTが言う電位差の範囲そのものでした。
以上よりGNDループが原因と判断しました。
GNDループという言葉は知っていたものの、こういったところで発生するということを再認識しました。
追加トライ
ちなみにここまでは片方のマイコンはPCへ、もう片方はUSB HUB経由の接続でした。
ここで、マイコン間のGNDは外し、同じUSB HUBで接続すると同様に文字化けが発生しました。
この時にGNDを繋いでも文字化けは解消されず、当初の接続である片方はPC直結、片方はUSB HUB経由の接続に戻すと安定しました。
これも別ルートでGNDループが発生しているのでしょうか...?ただ、同じUSB HUBに2台マイコンを繋いで通信させるのがNGとなると何か通常の使い勝手としても難ありでは、と思ってしましましたが、一旦そういうものと割り切っておきます。
(環境: MacBook AirとUGREEN製多機能ハブ)