2

Python 3.3.2 と pyserial を使用して、RS232 からデータストリームを読み込もうとしています。ストリームを次のように開始します。

ser = serial.Serial('/dev/ttyUSB0', baudrate=19200, timeout=3, stopbits=serial.STOPBITS_TWO)
ser.write(bytes([0x05, 0x69, 0x02, 0x0A, 0x86]))

この後、毎秒 107 バイト長のデータセットを取得します。最初のバイトは 107 (バイト数)、2 番目のバイトは 105 (コード) にする必要があります。

107 と 105 で始まる 107 バイト長の 1 つのデータセットを分離する最良の方法は何ですか? print(ser.read(107))数回使用すると、次のようになります。

b'\x00\x00\x00\x00\x00P\xbf\x99\x10\xe0}\x86\xaaV\xd4\xeeg\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87}i\xdf\n\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xc3k\x00\x00\x00\xc0t\xb4\xbd\xf0\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x80\x01\x00\x80\xc7\x10\xc0\xcd\xe6G\x0b\x99\xd4\xcb.'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xeck\x00\x00\x00\xc0\xf4\xb3\xbd\xf0\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0V\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\xc8\x10@\xcd\xe67\x8b\x99\xd4\x0b/\x00\x00@\x00\xf6\xb7\xbf\xfd\xed\xaf:\x00\x00\x00\xe8\xf3J\xaf\x04\x00\x00\x00\x00\x00p\xbf\x99\x18\xe0}\x86\xaaV\xd4\xeeg\x12\x00\x00\x00\x00\x00\x00\x00'

(107のkascii) は、中間のどこかにあります。

4

1 に答える 1

2

リクエストを送信する前に入力をフラッシュすると役立つ場合があります。すなわち、

ser.read(ser.inWaiting())

待機中のすべてのバイトを読み取る。次に、それ以上バイトが送信されないことを期待して、コマンドを送信できます。

ser.write(bytes([0x05, 0x69, 0x02, 0x0A, 0x86]))

これは、次に来るすべてのバイトがこのコマンドへの応答であることを確認するためのものです。

次に、107 が得られるまでデータを読み取ります。

found = False
buffer = '' # what is left from the previous run...
while not found:
    rd = ser.read(50)
    buffer += rd
    sp = buffer.split(chr(107), 1)
    if len(sp) == 2:
        pkt = chr(107) + sp[1] # candidate for a valid packet
        if pkt[1] == chr(105): # 
            while len(pkt) < 107: # TODO add a timeout condition here...
                rd = ser.read(107 - len(pkt))
                pkt += rd
            found = True
        else:
            buffer = pkt[1:] # process this further...
    else: # no 107 found; empty the buffer.
        buffer = ''
# Now we have a pkt of 107 bytes and can do whatever we want with it.
于 2013-10-13T18:11:40.920 に答える