Pyserialを使用してPythonから入出力エラーを取得する
-
13-09-2019 - |
質問
Arduinoボードにデータパケットを書き込むPythonスクリプトがあります パイサリア. 。ボードにコードを書き込んでいるときに、pyserialがerrno 5で入出力エラーを上げることがあります。
いくつかの調査によると、これはArduinoボードへの接続を表すファイルに記述しているときにエラーを示しています。
送信するコードは、単一のバイトパケットのみを送信します。
try:
# Check if it's already a single byte
if isinstance(byte, str):
if len(byte) == 1: # It is. Send it.
self.serial.write(byte)
else: # It's not
raise PacketException
# Check if it's an integer
elif isinstance(byte, int):
self.serial.write(chr(byte)) # It is; convert it to a byte and send it
else: raise PacketException # I don't know what this is.
except Exception as ex:
print("Exception is: " + ex.__getitem__() + " " + ex.__str__())
このコードによって印刷されたエラーは次のとおりです。
OSエラー入力/出力エラーERRNO 5
送信中に私のコードに何か問題がありますか?シリアル接続が何かを送信する準備ができているかどうかを確認する必要がありますか、それとも送信後に遅延がある必要がありますか?または、ハードウェアやハードウェアとの接続に問題がある可能性がありますか?
編集: :PyserialからLinuxの実装を調べましたが、実装はコードにエラーを渡すだけです。そこからの新しい本当の洞察はありません。プログラムで何が起こっているのかをテストする良い方法はありますか?
解決
ご不便をおかけして申し訳ありませんが、エラーはArduinoがそれ自体をリセットし、したがってコンピューターへの接続を閉じることによって引き起こされると確信しています。
他のヒント
あなたのコードですぐに見ることができる唯一の問題はインデントの問題です - あなたのコードを次のように変更します:
try:
# Check if it's already a single byte
if isinstance(byte, str):
if len(byte) == 1: # It is. Send it.
self.serial.write(byte)
else: # It's not
raise PacketException
# else, check if it's an integer
elif isinstance(byte, int):
self.serial.write(chr(byte)) # It is; convert it to a byte and send it
else:
raise PacketException # I don't know what this is.
except Exception as ex:
print("Exception is: " + ex.__getitem__() + " " + ex.__str__())
あなたのエラーがこれからもたらされるとは思いませんが、このように試してみてください!あなたはチェックしていたかどうか byte
です int
それがaである場合にのみ str
, 、だから elif
いつも 定義により失敗しました。しかし、私はあなたがいると思います 本物 コードインデンテーションはこのようなものでした、あなたは SyntaxError
, 、だから私はあなたが投稿に誤りを犯しただけで、あなたの本当の問題は隠されたままです。
Windowsでこれを実行している場合、Pythonスクリプトを実行すると同時にシリアル接続でArduino IDEを開くことはできません。これにより、同じエラーがスローされます。
あなたや同様の問題を抱えている他の人々に役立つかもしれないいくつかのコメントを提供してみましょう。まず、シリアルモニターで数回Arduinoスケッチを実行してみてください。 IDEメニューのツールの下にシリアルモニターを見つけることができます。 Ctrl-Shift-Mと入力して、シリアルモニターを呼び出すこともできます。
シリアルモニターには、Arduinoスケッチが送信するものが表示されます。ただし、Arduinoスケッチに送信されるデータを入力することもできます。つまり、シリアルモニターを使用して、シリアルデータフローの両側をテストおよびデバッグします。
現れるものを見てください。 Sketchがserial.print()を介してデータを送信しようとすると仮定すると、非常に役立つことがよくあります。いくつかのメモ。シリアルモニター内で設定されたボーレートがスケッチのボーレートと正確に一致することを絶対に確認してください(9600はほとんどすべての場合に適しています)。
2番目のメモが重要です。シリアルモニターを持ち上げると、Arduinoボードのリセットが強制されます。あなたのスケッチは(常に)終了します。毎回新鮮な走りをするので、これは良いことです。ボーレートを9600に設定するだけで、リセットを強制することができることに注意してください(既に9600であっても)。これにより、毎回シリアルモニターを再起動することなく、シリアルモニター内で多くのテストを実行できます。