2016-08-04 175 views
3

私の生活の中で、私のラズベリーパイを使ってPython 3でノンブロッキングシリアル読み取りを行う方法を理解できません。ここでpySerialを使ったPython 3ノンブロッキング読み取り(pySerialの "in_waiting"プロパティが機能しない)

は私のコードです:

import serial #for pySerial 

ser = serial.Serial('/dev/ttyUSB0', 9600) #open serial port 
print ('serial port = ' + ser.name) #print the port used 

while (True): 
    if (ser.in_waiting>0): 
     ser.read(ser.in_waiting) 

結果:あなたが記載されているhttp://pyserial.readthedocs.io/en/latest/pyserial_api.html

+0

このメソッドをデバッグするにはdirとhelpを使用します。 – Dan

+1

'pyserial'のどのバージョンを使用していますか?' print(dir(ser)) '、' help(ser.in_waiting) ' 3.0以前のバージョンでは、in_waiting'プロパティを使うのではなく、 'inWaiting()'関数を呼び出す必要があります。 – theorifice

+0

私はPython 3.2.3を使用しています。私はプロパティに正しくアクセスしていますか?私は本当にプロパティと関数の違いを理解していません(新しいPythonユーザ)。 –

答えて

2

ドキュメントのリンクを:
AttributeError: 'Serial' object has no attribute 'in_waiting'

ここで私はそれが存在する "in_waiting" 私に言った参照していリファレンス・ページがありますPySerial 3.0で追加されたプロパティとしてin_waitingを示しています。 PySerial < 3.0を使用している可能性が最も高いので、inWaiting()関数を呼び出す必要があります。

次のようにPySerialのバージョンを確認することができます:

import serial 
print serial.VERSION 

あなたがpipを使用してPySerialをインストールした場合、アップグレードを実行することができるはずです(管理者権限が必要な場合があります):

pip install --upgrade pyserial 

それ以外の場合は、PySerialから適切なインターフェイスを使用するようにコードを変更してください。< 3.0:

while (True): 
    if (ser.inWaiting() > 0): 
     ser.read(ser.inWaiting()) 
+0

私は、(少なくともPython 3では)受信したシリアルデータを印刷することに気づいたので、 'ser.read(ser.inWaiting())'を 'print(ser.read(ser.inWaiting()デコード関数はバイナリ配列を文字列に変換しますが、これは何らかの理由でprint()関数がすべての印刷の最後に改行( '\ n')を追加するのと同じように、 –

+0

私は普通の 'print(my_str)'を 'print(my_str、end = '')に置き換えたのですが、 '、それは改行を抑止しますが、今はPythonコードにシリアル経由でリターンキーを送ると、改行をする代わりにファンキーな文字が出力されます。 –

関連する問題