3

シリアル機能をテストするための簡単なプログラムがあります。私のシリアル デバイスは 2 つの入力に反応します。ユーザーが「a」を入力すると、「fg」で応答します。ユーザーが他の文字/バイトを入力すると、「z」で応答します。'b' をシリアル デバイスに送信すると、正常に 'z' が返されます。「a」を送信すると、「f」と「g」の両方が返されるはずなので、1 バイトではなく 2 バイトになります。

以下のコードを参照してください。

#!/usr/bin/env python

import serial

ser = serial.Serial(
    port = '/dev/ttyUSB0',
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS
    )

ser.write('a')
byteData = ser.read(1) # read one, blocking
moreBytes = ser.inWaiting()

if moreBytes:
    byteData = byteData + ser.read(moreBytes)
    print byteData

print byteData


ser.close()

出力は次のとおりです。

user@ubuntu:~/code/native$ ./serialTesting.py 
f

inWaiting() は値 0 を返すため、2 番目のバイトを読み取ることはありません。コードに小さな変更を加えて、予想される 2 バイトを手動で読み取ると、正常に動作します。

#!/usr/bin/env python

import serial

ser = serial.Serial(
    port = '/dev/ttyUSB0',
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS
    )

ser.write('a')
byteData = ser.read(2) # read two expected bytes for the result 'fg'

print byteData

ser.close()

出力は期待どおりです。

user@ubuntu:~/code/native$ ./serialTesting.py 
fg
4

2 に答える 2

1

ボーレートが非常に遅いことが原因である可能性があります。2 番目のバイトがバッファに到達する前に、inwaiting() 呼び出しを処理しています。ser. read(2) を実行すると、2バイトが受信されるまで待機(ブロック)されるため、機能します。タイムアウトを 1 秒に設定してみてください。これで問題が解決するはずです。

ser = serial.Serial(
    port = '/dev/ttyUSB0',
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS,
    timeout=1 # add this
    )
ser.write('a')
byteData = ser.read(1) # read one, blocking
byteData += ser.read(ser.inWaiting())

print byteData

ser.close()
于 2013-10-24T21:04:54.750 に答える