gpt4 book ai didi

python - Pyserial 格式 - 超过 127 的字节返回为 2 个字节,而不是一个

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:44 26 4
gpt4 key购买 nike

我有一个程序在我的 Arduino 上运行,它接受串行输入,并将其保存到一个变量中。很有魅力。使用内置串行监视器的 Arduino 应用程序,我已成功发送和接收 0-255 之间的字节。

使用 pyserial,发送任何高于 127 的字节(或 0b01111111),pyserial 返回 2 - 表示高于 127 的值,例如 0b10000000,将发送 2 个字节,而不是一个。

因此,我认为我的问题出在 pyserial 上。

ser.write(chr(int('01000000', base=2)).encode('utf-8'))

完美运行,Arduino端正确接收。

ser.write(chr(int('10000000', base=2)).encode('utf-8')) 

然而,返回 2 - 并在 Arduino 上显示为 0b110000100b10000000

最佳答案

正如 NPE 所说,这是 UTF-8 的编码 - 128 和 2047(8 - 11 位)之间的一个字节被转换为两个字节:如果原来的 11 位是 abcdefghijk 那么 utf-8 版本是 110abcde 10fghijk。在您的示例中(填充左 0 以生成 11 位),00010000000 将转换为 11000010 10000000 或\xc2\x80,这正是您所看到的。查看Wikipedia article on UTF-8 for more

你可以在 python 中使用这段代码看到这一点(我将 int('10000000', base=2) 替换为 128):

>>> unichr(128).encode('utf-8')
'\xc2\x80'

让我感到困惑的是,您可以使用 chr(int('10000000',base=2)).encode('utf-8'),或等效的 chr(128).encode('utf-8) '.当我这样做时,我得到:

>>> chr(int('10000000', base=2)).encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

您是否更改了默认编码?

您需要的是一种使用一个字节表示 0 - 255 并匹配 unicode 的编码。所以请尝试改用“latin_1”:

>>> unichr(128).encode('latin_1')
'\x80'

关于python - Pyserial 格式 - 超过 127 的字节返回为 2 个字节,而不是一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com