0

シリアル経由でコマンドを送信すると、スレーブは16進数のシーケンスで応答します。

このシリーズ:

05 06 40 00 02 05 F6 5C

私にくれます

05 07 40 05 02 05 71 37 FF

応答は常にFFバイトで終了します。したがって、FFに遭遇するまで、バイトをバッファに読み込みたいと思います。バッファよりも印刷され、関数が返されるはずです。

import serial

s_port = 'COM1'
b_rate = 2400

#method for reading incoming bytes on serial
def read_serial(ser):
    buf = ''
    while True:
        inp = ser.read(size=1) #read a byte
        print inp.encode("hex") #gives me the correct bytes, each on a newline
        buf = buf + inp #accumalate the response
        if 0xff == inp.encode("hex"): #if the incoming byte is 0xff
            print inp.encode("hex") # never here
            break
    return buf   

#open serial
ser = serial.Serial(
    port=s_port,
    baudrate=b_rate,
    timeout=0.1
)

while True:

    command = '\x05\x06\x40\x00\x02\x05\xF6\x5C' #should come from user input
    print "TX: "
    ser.write(command)
    rx = read_serial(ser)
    print "RX: " + str(rx)

私に与える:

TX: 
05
07
40
05
02
05
71
37
ff

なぜ条件が満たされないのですか?

4

1 に答える 1

1

It's because you're comparing apples and oranges. inp.encode("hex") returns a string. Let's say you read the letter "A". "A".encode("hex") returns the string "41" and 0x41 != "41". You should either do:

if '\xff' == inp:
    ....

Or, convert inp into a number using ord():

if 0xff == ord(inp):
    ....

Then it should work as expected.

于 2012-10-17T07:58:48.543 に答える