使用 serial.write(( 向 Arduino 发送一个换行符 (( 终止的字符串。
将 python 2.x 脚本转换为 python 3.x 时,以下结果产生了"不支持 Unicode"错误:
cmd = "a string"
cmd = cmd + "n"
serial.write(cmd)
更改为
serial.write(cmd.encode('ascii'))
消除了错误
但是,我不清楚究竟是通过什么传播的
serial.write(cmd.encode('ascii'))
控制台会话生成了以下内容:
>>>cmd = "a string"
>>>print(cmd)
a string
>>>cmd = cmd + "n"
>>>print(cmd)
a string
#note following blank line
>>>print(cmd.encode('ascii'))
b'a stringn'
如果我要执行:
>>>serial.write(cmd.encode('ascii'))
究竟会发送什么? 它是否包括首字母 b,如打印语句中所示? 它会包括单引号吗? 它会发送换行符 (0x0A( 的 ASCII 字节代码,还是反斜杠 (0x5C( 和"n"(0x6E( 的 ASCII 字节代码?
呃。在 Python3 中使用字符串和字节字符串时,当您第一次遇到它们时,它们可能会非常令人沮丧和困惑。这个答案对此有一个很好的解释。
PySerial 适用于字节字符串。要将字符串写入串行端口,您必须将其encode()
为字节字符串。要从串行端口读取字符串,您必须decode()
.
在代码中,如果可以将所有内容保留为字节字符串,则可以避免执行所有编码和解码。但是你必须记得输入一个额外的b字符:
cmd = b"a string"
cmd = cmd + b"n"
serial.write(cmd)
或者您也可以选择编码/解码:
cmd = "a string"
cmd = cmd + "n"
serial.write(cmd.encode('ascii'))
Python 交互式 shell 将表示众所周知的 ascii 字符作为它们的转义码:
>>> 'x0a';'x0d'
'n'
'r'
许多字符将保留为字节表示:
>>> 'x00'; 'x01'
'x00'
'x01'
回到你的问题,如果你发送
serial.write(b"a stringn")
b
不会发送,n
以 chr(10( 或 b'\x0a' 发送。