Fal*_*rri 5 python hex serial-port
所以我有一种无知(可能?)的问题.我正在第一次写一个串行设备.我有一个帧[12,0,0,0,0,0,0,0,7,0,X,Y]我需要发送.X和Y是校验和值.我对使用pyserial模块的理解是我需要将这个帧转换为字符串表示.好吧,那很好,但我对应该采用的格式感到困惑.我试过了
a = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y]
send = "".join(chr(t) for t in a)
Run Code Online (Sandbox Code Playgroud)
但我的困惑来自于这样一个事实,即当使用chr时,X和Y会转换为奇怪的字符串(假设它们的ascii表示).例如,如果X是36,则chr(x)是'$'而不是'\ x24'.有没有办法我可以得到一个代表'\ xnn'值而不是ascii代码的字符串?令我困惑的是,12和7正确地转换为'\ x0b'和'\ x07'.我错过了什么吗?
更新:
所以我可能不太了解串行写入是如何完成的,或者我的设备对我的期望是什么.这是我的C代码的一部分工作:
fd=open("/dev/ttyS2",O_RDWR|O_NDELAY);
char buff_out[20]
//Next line is psuedo
for i in buff_out print("%x ",buff_out[i]); // prints b 0 0 0 0 0 0 0 9 b3 36
write(fd,buff_out,11);
sleep()
read(fd,buff_in,size);
for i in buff_in print("%x ",buff_in[i]); // prints the correct frame that I'm expecting
蟒蛇:
frame = [11, 0, 0, 0, 0, 0, 0, 0, 9] + [crc1, crc1]
senddata = "".join(chr(x) for x in frame)
IEC = serial.Serial(port='/dev/ttyS2', baudrate=1200, timeout=0)
IEC.send(senddata)
IEC.read(18) # number of bytes to read doesn't matter, it's always 0
我是以正确的方式来做这件事的吗?显然你不能确切地告诉它,因为它是特定于设备的,我不能真正给出太多细节.但这是serial.send()期望数据的正确格式吗?
如果 ASCII 字节可以打印,则用单个字符表示是完全正常的,否则用符号表示\x??。在这两种情况下,它们都表示单个字节,您可以用以下任一方式编写字符串:
>>> '\x68\x65\x6c\x6c\x6f'
'hello'
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用的是 Python 2.6 或更高版本,那么您可能会发现使用内置函数bytearray比使用ordor更容易、更自然struct。
>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 36, 100]
>>> b = bytearray(vals)
>>> b
bytearray(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d')
Run Code Online (Sandbox Code Playgroud)
您可以仅通过强制转换来转换为 a str(或bytes在 Python 3 中),并且可以索引字节数组以获取整数。
>>> str(b)
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d'
>>> b[0]
12
>>> b[-1]
100
Run Code Online (Sandbox Code Playgroud)
至于你的串行Python代码,它对我来说看起来很好 - 我不知道为什么你认为有问题......