4

我有一个在我的 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

4

1 回答 1

2

正如 NPE 所说,这是 UTF-8 的编码 - 128 和 2047(8 - 11 位)之间的一个字节被转换为两个字节:如果原始的 11 位是 abcdefghijk,那么 utf-8 版本是 110abcde 10fghijk。在您的示例中(填充左 0 以形成 11 位),00010000000 将转换为 11000010 10000000 或 \xc2\x80,这正是您所看到的。有关更多信息,请参阅有关 UTF-8 的 Wikipedia 文章

您可以使用以下代码在 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'
于 2013-01-25T06:00:18.047 回答