0

我目前正在尝试通过 RS485 连接到电表。到目前为止,它工作得很好,除了我在读取仪表在 RS485 线路上写回的内容时遇到问题。

我知道电表的数据是正确的,因为我可以使用 Docklight 和制造商的内部程序读取它。

所以我唯一的问题是我要返回的十六进制字节的转换。

我正在接收

>>> b'\x01\x03\x04Ce/\xec\xe2'

这应该是 8 或 9 个十六进制字节。我希望收到类似的东西

>>> b'\x01\x03\x04\x43\x67\x81\xEC\x43\x68'

问题似乎是python尽可能地将它解释为“ASCII”,并且由于非十六进制数字,我无法进一步转换它。我得到的错误是

>>> binascii.Error: Non-hexadecimal digit found`

当我从另一边看它时,相当于。我正在发送

>>> data=bytearray([0x01,0x03,0x4A,0x38,0x00,0x02,0x53,0xDE])

显示为

>>> bytearray(b'\x01\x03J8\x00\x02S\xde')

当我打印它时

那么我如何告诉 python-3 我想查看 8 个十六进制字节而不是他自动做出的一些解释呢?我相信一旦您知道在哪里寻找,我就会错过一些非常容易的东西。

我想将字节 4、5、6、7 转换为浮点数。但由于它向我显示非十六进制数字,我不能这样做。

4

2 回答 2

1

C,e也是/字节;它们是ASCII 字符,因此不需要使用\x..十六进制转义符显示。

您也不需要解码\x..十六进制转义,它们正是 Python 为您提供bytes对象的调试表示的方式;每个字节要么显示为转义序列,要么显示为可打印的 ASCII 字母。

同样的情况也发生在你的例子中:

>>> b'\x01\x03\x04\x43\x67\x81\xEC\x43\x68'
b'\x01\x03\x04Cg\x81\xecCh'

这是完全相同的值,但是\x68是 ASCII letterh等。

输出是对象的默认repr()输出bytes。它不能改变。如果您需要不同的输出,则必须编写自己的代码。

您可以使用该函数将所有字节显示为十六进制binascii.hexlify(),例如:

>>> import binascii
>>> binascii.hexlify(b'\x01\x03\x04\x43\x67\x81\xEC\x43\x68')
b'010304436781ec4368'

现在你有一个bytes带有十六进制字符的字符串。或者您可以使用一个str.join()函数,将每个单独的字节转换为十六进制,并以\x文字为前缀:

>>> ''.join(r'\x{:02x}'.format(byte) for byte in b'\x01\x03\x04\x43\x67\x81\xEC\x43\x68')

'\x01\x03\x04\x43\x67\x81\xec\x43\x68'

>>> print(''.join(r'\x{:02x}'.format(byte) for byte in b'\x01\x03\x04\x43\x67\x81\xEC\x43\x68'))
\x01\x03\x04\x43\x67\x81\xec\x43\x68

这是一个str\,x和十六进制数字作为字符的对象。

请注意,这只是显示值。价值没有改变;字节都在那里,但是你显示它们。如果您需要将 4 个字节转换为浮点数,则只需转换这 4 个字节:

struct.unpack('f', yourbytes[4:])  # 4 bytes for C float in native order

这使用struct模块直接使用字节。不需要十六进制表示:

>>> import struct
>>> struct.unpack('f', b'\x01\x03\x04Ce/\xec\xe2'[:4])
(132.01173400878906,)
于 2016-08-10T12:59:44.527 回答
1

您可以使用struct.unpack()从数据中获取数字。这是方法:

In [171]: import struct

In [190]: b2
Out[190]: b'\x01\x03J8\x00\x02S\xde'

In [191]: struct.unpack('B'*len(b2), b2)
Out[191]: (1, 3, 74, 56, 0, 2, 83, 222)

In [192]: [*map(hex, struct.unpack('B'*len(b2), b2))]
Out[192]: ['0x1', '0x3', '0x4a', '0x38', '0x0', '0x2', '0x53', '0xde']
于 2016-08-10T13:24:06.673 回答