2017-01-01 14 views
0

私は、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コードの問題です。誰かがこれについての洞察を持っているなら、私は本当にそれを感謝します!

+0

いつも行の最後を取得すると、これはreadline()がいつ停止するかを知っていることを私に伝えます。したがって、私は、sleep(2)を削除したり、大幅に減らしたりして、readline()をできるだけ早く動作させようとします。 –

+0

これは、私がpyserialのニュアンスを理解しないかもしれないところです。私は入力を洗い流し、ステータスpingが応答を返すのを待つために1秒待つことを望んでいました。私はそれを前と後の1秒間に寝るように変更しました。なぜ私は強盗の始まりを切っているのだろうかと思っていました。 –

+0

私はpyserialを使用しているのでしばらくしていましたが、私は任意のスリープを削除し、必要に応じてSerial()に長いタイムアウト値を与えることをお勧めします。また、私はあなたが必要と確信していない限り、入力を定期的にフラッシュしません。私はより多くを提供することを願っています。 –

答えて

0

(シリアル)通信では、は常に部分応答を受け取ることをお勧めします。

この場合の通常の解決方法は、json.loadsでそれを正しく解析できるようになるまで、シリアルから読み込んだものを文字列/バッファに追加することです。

import serial 
import json 
import time 

ser = serial.Serial('/dev/ttyACM0', 9600) 

buffer = '' 
while True: 
    buffer += ser.read() 
    try: 
     data = json.loads(buffer) 
     print(data) 
     buffer = '' 
    except json.JSONDecodeError: 
     time.sleep(1) 

this answerから)。

フラッシュすると、データが失われることに注意してください。

また、これはやや簡潔な解決策です。理想的には、バッファは、成功した解析後に残るwhaterversにリセットする必要があります。しかし、私が知る限り、jsonモジュールはその機能を提供していません。

+0

私は、私がラインを読んでいることを除いて、これにかなり似ています。私はこれを破棄し、あなたが私に与えているようなバッファソリューションに移行しなければならないと思っていますが、私が本当に投げ捨てたのは、私のコードは、私に文字列を与えない限り、文字列の終わりではなく、始まりではありません。 –

+0

@ JohnSly 2つの考えられる原因は、バッファをフラッシュしているか、バッファオーバーランが原因です。ハードウェアバッファのサイズは変更できませんが、シリアルドライバのメモリバッファのサイズを設定できる必要があります。これを行う方法は、OS固有のものです。 –

関連する問題