Linuxマシンから組み込みデバイスにファイルサイズを送信するためのこのコードがあります:
#send length
device_port = serial.Serial("/dev/ttyUSB1", 115200, timeout=3)
device_port.write(program_length_str)
#get response
answer = device_port.readline()
if answer != "OK":
print "Size transmit failed:"
print `answer`
device_port.close()
quit()
問題は、このコードを実行すると (常にここで終了します)、プログラマー (同じシリアル ポート経由でデバイスにファームウェアをロードする) がbad file descriptor
エラーで終了することです。デバイスを再接続しても (内部エネルギー源がありません)、コンピューターを再起動する必要があります。Python コードの何が問題になっていますか? デバイス (FT2232) を再接続しても、悪い設定が残る可能性があるのはなぜですか?
cutecom でポートを開くとデバイスのプログラミングが可能になりますが、再度閉じるとエラーが再発します。
UPDATE 1:使用strace
して、最初の違いはロックにあることがわかりました:
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = 4正常なロードの開始時に、
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)
失敗したとき。2 つ目の違い (およびエラー全体) はローダーのバグかもしれないので、ツールチェーン フォーラムに書きました(彼らはread()
0 を返すことをエラーと見なし、 を呼び出しますが、エラーperror()
はなかったので、以前から errno に EBAFD が格納されています)。 . しかし、私はロックについて興味があります。cutecom または python スクリプト (strace を使用) で参照を見つけることができませんでしたが、ロックは何らかの影響を受けています。この質問を Unix & Linux サイトに移行することはできますか?
更新 2: 前に述べたように、問題はread()
シリアル ポートで 0 が返されることです。これに注目すると、非ブロック モードで read() がブロックまたは EAGAIN を返す必要があることがわかりました。どのような状況で read() 呼び出しが 0 を返すことがありますか?
更新 3: 呼び出しでデバイスを待機することで、ローダーの問題を「解決」しましたselect()
。ポート内の何かを変更する PySerial にはまだ問題があります。