将换行符终止的字符串从 Python 发送到 Arduino



使用 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' 发送。

最新更新