4

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 にはまだ問題があります。

4

2 に答える 2

0

私はpythonシリアルとubuntuでかなりの作業をしましたが、問題はubuntuがシリアルポートを「マウント」する方法であり、時々失敗し、...

dmesg の出力を投稿できますか? これは、問題の根本を再確認するのに役立つ場合があります。

于 2012-03-15T16:26:17.773 に答える
0

あなたの問題はPythonとは何の関係もないと思います。

Ubuntu を使用して Arduino をプログラミングしているときに同じ問題に直面しました。数回プラグを差し込んでから再度外すと、Ubuntu がデバイスを認識しなくなることがありました。その後、単に表示されませんでした/dev/

それがあなたの問題の原因でもあると思います。bad file descriptorほとんどの場合、指定したパスが実際には存在しないことがわかります。チェックしました/dev/ttyUSB0か?それでもうまくいかない場合は、インストールを利用可能な最新のものにアップグレードすることをお勧めします。

于 2011-05-23T18:00:55.010 に答える