概要
Windowsでシリアル出力をしているESP32デバイスなどを接続するとマウスが暴走することってありますよね?
暴走するとかなり辛いので対応方法を調べてみました。
原因

Windowsの標準ドライバで「Microsoft Serial BallPoint」か「 Microsoft Serial Mouse」で認識した場合に暴走する危険があります。
回避方法
レジストリ「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sermouse」に4を書き込むと回避できるみたいです。 。 。
できれば、書き込みたくないですよね?
再現スケッチ
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.printf("val:%d\n", rand());
}
M5StickC Plusで上記を転送し、USBを抜き出しすると大体5回に1回ぐらい誤判定します。基本的に書き込んだ直後は問題ありません。その状態で忘れて次にUSBを認識したときに誤判定するとマウスが暴走して大惨事になる可能性があります。
プログラムを変更して、再現しないようにしてみます。
おそらく大丈夫スケッチ
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.printf("val:%d\n", rand());
delay(3);
}
いろいろ試行錯誤したのですが、 文字の出力インターバルを広げることで安定動作できるようになりました。delay(3)なので秒間約33回出力しています。
delay(2)の秒間約50回でも再現しにくかったですが10回ぐらいUSBを抜き出しすると誤判定しました。また、Serial.begin(115200)の後に固定文字や長めのdelay()を入れても改善はしませんでした。
抜き差しでの認識パターン
- シリアルは認識しているがシリアルモニタを開き直さないと再開しない
- シリアルモニタに出力が再開される
- 「Microsoft Serial BallPoint」などで認識されるが三角マークで暴走しない
- 「Microsoft Serial BallPoint」などで認識され、数秒フリーズしたあと暴走する
上記4パターンがありました。上にあるほどよくおこる現象でした。シリアルモニタに出力が再開されるかは結構運の要素があります。
まとめ
とりあえず数値をシリアルに出力する場合には、delay(10)とか入れておかないとマウスが暴走する可能性があります。テストだからと垂れ流しにするとUSBを再認識したときにマウスが暴走するので気をつけましょう!
本当に秒100回とか高速にデータが取りたいときには気をつけて使いましょう。。。
コメント