2012-08-03 53 views
1

我一直坚持这一段时间了。我需要发送一个串行命令到python的设备。下面是格式的示例:十六进制格式在Python中

ser = serial.Serial('/dev/ttyO1',baudrate=115200) 
ser.write('\xAA\x04\x05\x00\x00\x00') 

我可以,如果我通信使用的格式.WRITE沟通就好了(〜十六进制字节〜)

然而,当我需要接受更大的块数据,设备的通信协议将事情分成数据包,我必须确认接收每个数据包。为了避免在为每个数据包输入单独的ser.write()命令时出现腕管综合征,我想编写一个循环,为我执行数据包计数/确认。这里就是我:

for n in range(0,num_packets,1): 

    x = '\\x'"%0.2x"%(n)  
    print('Picture Ready Host Ack') 
    ser.write('\xAA\x0E\x00\x00' + x + '\x00') 
    time.sleep(.1) 
    response = ser.read(ser.inWaiting()) 
    image_write(response,base_path, filename)   

然而,双斜杠( '\ X' ..)给了我两条斜线:

'\xaa\x0e\x00\x00\\x05\x00' 

虽然单斜杠( '\ X' ...)当我定义变量x时返回一个问题:

ValueError: invalid \x escape 

...帮助?

回答

2

如果不是将x定义为'\\x'"%0.2x"%(n),而是x = chr(n),那么一切都应该起作用。

+0

哇。你是天才,今天我是n00b。谢谢乔纳森! – LapTux 2012-08-03 18:57:51

0

\xij只是扩展为字符chr(int(ij, 16)) 既然你是反正发送字节,我会说在一个循环中,发送你的第一个块。不要添加任何东西,然后通过chr(int(n),16)发送您的分隔符,然后是下一个块。这应该可以解决你的问题。