Python中来自微控制器的字节问题

Python中来自微控制器的字节问题,python,byte,Python,Byte,我正在使用Python在基于windows的程序中读取微控制器值。编码/字节编码和值开始让我感到困惑。以下是我的情况: 在该软件中,我可以为Python解释器接收的每个字节调用一次receive函数,为每个行调用一次(不太确定是什么),或为每个消息调用一次函数,我假设这是来自微控制器的整个传输 我正在努力寻找破解这些价值观的最佳方法。微控制器输出与协议相关的特定值。例如,调用本应返回hex值的函数: F0, 79, (the phrase standard_firmata.pde) [then]

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

在该软件中,我可以为Python解释器接收的每个
字节
调用一次
receive
函数,为每个
调用一次(不太确定是什么),或为每个
消息
调用一次函数,我假设这是来自微控制器的整个传输

我正在努力寻找破解这些价值观的最佳方法。微控制器输出与协议相关的特定值。例如,调用本应返回
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'
当设置为“每条消息一次”时。这就是我想要的,我可以看到发送的是正确的值,但是包含的值太多了(它们似乎在每个字节之后)。此外,第二个
字节
在假定为
79
时为
0y
。它似乎是在其他所有字符都是十六进制的情况下,用ASCII打印其值


如何忽略所有这些
null
字符并使所有内容都具有正确的格式(我对正常的十六进制值很满意)

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

>>> b'\x79'
b'y'
使用ASCII字符可以使表示更具可读性,但不会影响内容。创建
字节
值时,可以互换使用
\x..
十六进制和ASCII符号

数据似乎编码了一条消息,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'
UTF 16每个字符使用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')

可能的副本;吸烟者:我认为我们可以把它们当作两个独立的帖子;另一个是关于X-Y问题的帖子。我很高兴把它们合并在一起,但是,每个问题的答案都帮助我解决了两个不同的问题(即问题),所以我认为把它们分开是有意义的;很公平:)我应该解释一下。
\x02
\x03
是指微控制器上运行的固件版本。这是我困惑的一部分。ascii表示法用于字符,但不用于那些值(对应于主版本2,次版本3)@Startec:right,然后将它们直接转换为整数。@Startec:no,一个是索引,另一个是切片。索引为您提供整数,对另一个
字节
对象进行切片。@Startec:
[:1]
不会将其转换为列表,它会生成一个
字节
对象,其中包含切片的字节。@Startec:15年,正在计数。