python中十进制到十六进制

时间:2010-08-24 21:18:42

标签: python serial-port hex

所以我有一种无知(可能?)的问题。我正在第一次写一个串行设备。我有一个帧[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)

但我的困惑来自X和Y在使用chr时变换为奇怪的字符串(假设它们的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


的Python:



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()期望数据的正确格式吗?

4 个答案:

答案 0 :(得分:3)

如果可以打印ASCII字节由单个字符表示,则完全正常,否则通过\x??表示法。在这两种情况下,它们都代表一个字节,您可以以任何一种方式编写字符串:

>>> '\x68\x65\x6c\x6c\x6f'
'hello'

但是,如果您使用的是Python 2.6或更高版本,那么您可能会发现使用内置bytearray更容易,更自然,而不是使用ordstruct

>>> 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')

您可以通过强制转换转换为str(或Python 3中的bytes),并可以索引bytearray以获取整数。

>>> str(b)
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d'
>>> b[0]
12
>>> b[-1]
100

关于你的串口Python代码,它看起来很好 - 我不确定你为什么认为有问题......

答案 1 :(得分:1)

ASCII代码36 的字符 '$'。在任何ASCII表中查找。如果字符不可打印(控制字符等),Python仅显示十六进制转义。

在最低级别,无论如何都是相同的位模式 - 无论Python是将其打印为十六进制转义还是作为具有该ASCII值的char打印。

但您可能想要使用struct模块,它会为您处理此类转换。

答案 2 :(得分:0)

我猜你想要struct

>>> import struct
>>> struct.pack('>B', 12)
'\x0c'
>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0xa, 0xb]
>>> ''.join(struct.pack('>B', x) for x in vals)
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00\n\x0b'

答案 3 :(得分:0)

你做得很好:你的send就是你想要的:一个包含你想要的值的字节序列(a)。

如果您想查看send中字符的十六进制代码,您可以这样做:

import binascii
print binascii.hexlify(send)

print ''.join(r'\x%02x' % ord(char) for char in send)

(如果你想要\x前缀)。

直接打印repr(send)时所看到的是send表示,它使用ASCII:65代表'A',但字符12代表'\ x0c'。这只是Python使用的一种约定,当字符串包含单词时很方便,例如:显示'Hello'比\ x48 \ x65 \ x6c \ x6c \ x6f更好!