私は、USB経由で接続されたarduinoからの文字列でPythonコードの読み取りブロックに問題があります。シリアルは文字列が何であるか気にしないことを理解しています。私はserial.readlineを使用していますが、ドキュメントから完全一致のように聞こえますが、文字列は必ずしも完全ではありません。奇妙な問題は、文字列が常に文字列の先頭を持つとは限りませんが、文字列の終わりが常にあることです。私は本当にこれで失われていると私はシリアルデータを読むことのニュアンスやPythonがそれを処理する方法のニュアンスについて理解していないことは間違いないと確信しています。pythons serial.readlineが私の全行を受け取っていない
私が探しているものが見つかるまで、以下のコードではシリアルインターフェイスをループします。私は入力をフラッシュし、数秒間スリープ状態にして、新しい読み込みをする時間があることを確認します。
arduinoTemp = serial.Serial(iface, 9600, timeout=1)
arduinoTemp.flushInput()
arduinoTemp.flushOutput()
arduinoTemp.write("status\r\n".encode())
time.sleep(2)
read = arduinoTemp.readline().strip()
if read != "":
#check the string to make sure it's what I'm expecting.
JSONで文字列を送信しています。
私はこれに沿って、何かを期待している:
": t": "%"},"temp": {"num":"69.80","unit": "fahrenheit"},"heatIndex": {"num":"68.13","unit": "fahrenheit"}}
またはこの:最初は、私は思っ
atIndex": {"num":"0.00","unit": "fahrenheit"}}
{"id": "env monitor","distance": {"forward": {"num":"0","unit": "inches"}},"humidity": {"num":"0.00","unit": "%"},"temp": {"num":"0.00","unit": "fahrenheit"},"heatIndex": {"num":"0.00","unit": "fahrenheit"}}
が、私はこのように戻って何かを得るかもしれませんそれはいくつかの問題を引き起こしているかもしれない文字列の長さでしたが、カットオフは常に一貫しているとは限らず、ストリングの終わりには、それが前にすべてを得ていたはずの理由があります。
arduinoがarduino IDEとシリアルモニタと直接接続して正しく放送していることを確認しました。これは間違いなく私のPythonコードの問題です。誰かがこれについての洞察を持っているなら、私は本当にそれを感謝します!
いつも行の最後を取得すると、これはreadline()がいつ停止するかを知っていることを私に伝えます。したがって、私は、sleep(2)を削除したり、大幅に減らしたりして、readline()をできるだけ早く動作させようとします。 –
これは、私がpyserialのニュアンスを理解しないかもしれないところです。私は入力を洗い流し、ステータスpingが応答を返すのを待つために1秒待つことを望んでいました。私はそれを前と後の1秒間に寝るように変更しました。なぜ私は強盗の始まりを切っているのだろうかと思っていました。 –
私はpyserialを使用しているのでしばらくしていましたが、私は任意のスリープを削除し、必要に応じてSerial()に長いタイムアウト値を与えることをお勧めします。また、私はあなたが必要と確信していない限り、入力を定期的にフラッシュしません。私はより多くを提供することを願っています。 –