基于Python的微控制器字节问题

2024-05-16 03:03:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python在基于windows的程序中读取微控制器的值。编码/字节编码和值开始让我困惑。我的情况是:

在这个软件中,我可以在Python解释器接收到的每个byte调用一个receive函数一次,在每个line调用一次(不太清楚是什么),或者在每个message调用一次,我假设是来自微控制器的整个传输。你知道吗

我正在努力寻找破译这些价值观的最佳方法。微控制器输出与协议相关的特定值。例如,调用应该返回hex值的函数:

F0, 79, (the phrase standard_firmata.pde) [then] F7

退货:

b'\xf0y\x02\x03S\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00F\x00i\x00r\x00m\x00a\x00t\x00a\x00.\x00i\x00n\x00o\x00\xf7'

当设置为“每条消息一次”时。这就是我想要的,我可以看到发送的是正确的值,但是包含了太多的man\x00值(它们似乎在每个字节之后)。另外,第二个byte0y,而它应该是79。它似乎把它的值印在ASCII上,而其他的都是十六进制的。你知道吗

我怎样才能忽略所有这些null字符,并使所有内容都具有正确的格式(我可以使用普通的十六进制值)


Tags: 函数程序编码字节windows情况byte微控制器
1条回答
网友
1楼 · 发布于 2024-05-16 03:03:50

当Python表示bytes值时,它将对任何具有可打印字符的内容使用ASCII表示。因此,十六进制0x79字节实际上由y表示:

>>> b'\x79'
b'y'

使用ASCII字符可以使表示更具可读性,但不会影响内容。在创建bytes值时,可以互换使用\x..十六进制和ASCII符号。你知道吗

数据似乎编码了一个UTF-16消息,little endian:

>>> data = b'\xf0y\x02\x03S\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00F\x00i\x00r\x00m\x00a\x00t\x00a\x00.\x00i\x00n\x00o\x00\xf7'
>>> data[4:-1].decode('utf-16-le')
'̂StandardFirmata.ino'

UTF16每个字符使用2个字节,对于ASCII(和拉丁语1)码点,这意味着每2个字节都是空的。你知道吗

您可以使用简单的比较来测试消息类型:

if data[:2] == b'\xf0\x79':
    assert data[-1] == 0xf7, "Message did not end with F7 closing byte"
    version = tuple(data[2:4])
    message = data[4:-1].decode('utf-16-le')

相关问题 更多 >