4

pySerialを介して Arduino ボードにデータ パケットを書き込む Python スクリプトがあります。コードをボードに書き込んでいるときに、pySerial が errno 5 の入出力エラーを発生させることがあります。

一部の調査によると、これは Arduino ボードへの接続を表すファイルへの書き込み中にエラーが発生したことを示しています。

送信するコードは、1 バイト パケットのみを送信します。

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 の実装を調べましたが、実装はエラーをコードに渡すだけです。したがって、そこからの新しい真の洞察はありません。プログラムで何が起こっているかをテストする良い方法はありますか?

4

4 に答える 4

2

お手数をおかけして申し訳ありませんが、エラーの原因は arduino 自体がリセットされ、コンピューターへの接続が閉じられたことであると確信しています。

于 2009-06-15T21:45:22.287 に答える
1

これをWindowsで実行している場合、Pythonスクリプトの実行と同時にArduinoIDEをシリアル接続で開くことはできません。これは同じエラーをスローします。

于 2009-06-15T13:21:00.247 に答える
1

コードですぐに確認できる唯一の問題は、インデントの問題です。コードを次のように変更してください。

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あるかどうかをチェックしていたので、 は常に定義上失敗しました。しかし、実際のコードのインデントがこのようなものだったとしたら、 .intstrelif SyntaxError

于 2009-06-15T05:03:32.377 に答える
0

あなたと同様の問題を抱えている他の人々に役立つかもしれないいくつかのコメントを提供しようとしましょう. まず、シリアル モニターで Arduino スケッチを数回実行してみます。シリアル モニタは、IDE メニューの [ツール] の下にあります。Ctrl-Shift-M を入力して、シリアル モニターを起動することもできます。

シリアル モニターには、Arduino スケッチから返されたものが表示されます。ただし、Arduino スケッチに送信されるデータを入力することもできます。つまり、シリアル モニターを使用するだけで、シリアル データ フローの両側をテストおよびデバッグできます。

表示されるものを見てください。スケッチが Serial.print() 経由でデータを送り返そうとすると仮定すると、非常に役立つことがよくあります。いくつかのメモ。シリアル モニタ内で設定されたボー レートが、スケッチのボー レートと正確に一致していることを確認してください (ほとんどの場合、9600 が適切な選択です)。

2番目のメモは重要です。シリアル モニターを起動すると、Arduino ボードが強制的にリセットされます。あなたのスケッチは(常に)最初からやり直されます。毎回新鮮な走りができるので、これは良いことです。ボーレートを 9600 に設定するだけで強制的にリセットできることに注意してください (既に 9600 であっても)。これにより、毎回シリアル モニターを再起動しなくても、シリアル モニター内で多くのテストを実行できます。

于 2013-11-06T15:10:43.557 に答える