2024年4月9日火曜日

python pyserial windows10 STM32 "serial.serialutil.SerialException: Cannot configure port, something went wrong."

世界中の技術者を悩ませているトラブルがあるようです.わたしもハマりました.

条件は、、、
 ・windows  (windows10限定かも)
 ・pythonのpyserialで生じる  (わたしはpython3.12.2)
 ・わたしの環境ではSTM32のCDCで発生しました
 ・serial.Serial("COM4")のようにopenしただけでerrorで停まる
 ・error messageは、"serial.serialutil.SerialException: Cannot configure port, something went wrong."
 ・Teratermでは正常に動く

それまで動いていたのが、あるとき突然動かなくなりました.

検索したトラブルシュート事例では「CH340のdriverをupdateせよ」などと言われますが、わたしのはSTM32ですからCH340とは関係ありません.

かなり困りましたが、ロシア語のこのサイトが参考になりました.
そのサイト曰く、
「COM portのparameter設定を追確認したときの返り値の不一致で例外が発生しているのではないか? ならば例外を停めちまえ.」
だそうです.
わたしもそれに従います.

以下、わたしが成功したトラブル回避方法です.

pythonが出すエラーメッセージ全文を掲載します.
File "C:\Users\hira\AppData\Local\Programs\Python\Python312\Lib\site-packages\serial\serialwin32.py", line 222, in _reconfigure_port
raise SerialException(
serial.serialutil.SerialException: Cannot configure port, something went wrong. Original message: OSError(22, 'パラメー ターが間違っています。', None, 87)

このエラーメッセージのserialwin32.pyをeditorで開きます.pathは深いですがエラーメッセージに書かれています.pathはマシンによって違うかもしれません.

serialwin32.pyの中の例外を発生させている場所を探します.220行目ぐらいにありました.これらを行頭#でコメントアウトしてしまいます.行頭なのはindentを乱さないため.
# if not win32.SetCommState(self._port_handle, ctypes.byref(comDCB)):
#  raise SerialException(
#   'Cannot configure port, something went wrong. '
#   'Original message: {!r}'.format(ctypes.WinError()))

これでサクッと治りました.

かしこ

12 件のコメント:

  1. CH340のドライバはexeファイルだったので パソコンが いかれないか心配でした
    7zipで展開して ドライバ入れるべきだったか
    Windows10がだめなのか?

    返信削除
    返信
    1. ウイルスウィルスブルースウィルス

      おはようございます

      削除
  2. >ロシア語のこのサイトが参考になりました.
    「困ったときの、ロシア頼み(笑)」
    ※個人的には、ロシアは「敵に回してはいけない」と、思っている。
    Спасибо, Россия!

    返信削除
    返信
    1. こんどコメント欄をロシア語縛りにして敬意をあらわしましょう

      削除
    2. もはやアスキーアートだ、ロシア

      削除
    3. ツンデレのロシア娘のアニメがはじまるそうです

      削除
    4. そうそう、たまにロシア語がでるナターシャみたいなタイトルのやつですね

      削除
  3. >行頭なのはindentを乱さないため.
    こういう時、python は逆に不利ですね・・・
    ※複数行(ブロック)コメントって、無いんでしたっけ?
    ブロック毎(インデントが)ズレるから、ダメなのか・・・
    つか、「ソースそのまま」入ってんですね。デバドラもコンパイルしながら実行するのか?

    返信削除
    返信
    1. インタプリタの剥き出しさにたじろぎます.

      indent方式が大好きかというとヒラ的にはそんなでもないんです.

      削除
    2. >indent方式が大好き
      indent「でもいける」くらいだったら良かったのに、とも思わなくはない。
      ※indent は、「目に見えない」ので、私も、{} のほうが好きです。
      やっぱり、「JavaScript最強説」を取りたい。

      削除
    3. さすがはJavaScript LOVERでござーる

      削除