如何通过PySerial发送字节数组?求Python版Kotlin类似实现
Python通过PySerial向Arduino发送字节数组的正确方法
现有代码问题分析
你提供的代码存在几个不符合需求的地方:
ser.write(json.dumps(data) + '\n'):发送的是JSON格式的字符串(比如"[49,56,48]"),而非原始字节数组,Arduino需要额外解析JSON才能获取数值,这不是直接发送字节的方式。ser.write(str('R').encode()):虽然能发送正确的字节(b'R'),但str('R')属于冗余操作,直接用b'R'或'R'.encode()更简洁。ser.write(str(80).encode()):发送的是字符串"80"的字节(b'80'),如果你的需求是发送十进制80对应的单个字节(即ASCII字符'P'),这就不符合预期;若只是发送"80"字符串则没问题,但通常控制Arduino需要的是单个字节指令。
对应Kotlin写法的Python实现
1. 直接构造字节数组(对应Kotlin byteArrayOf(49,56,48))
Python中直接将整数列表转为bytes对象即可,这是PySerialwrite()方法接受的buffer类型:
data = [49, 56, 48] ser.write(bytes(data)) # 发送的是字节序列b'180',对应十进制[49,56,48]
2. 单个字符转字节(对应Kotlin byteArrayOf('O'.code.toByte()))
有两种简洁方式:
# 方式1:直接用字节面值 ser.write(b'O') # 等价于发送十进制79对应的字节 # 方式2:通过字符编码转换 ser.write(bytes([ord('O')])) # ord('O')获取字符的ASCII码,再转为字节
3. 字符串转字节数组(对应Kotlin "70".toByteArray())
如果是将字符串转为字节序列,直接用字符串的encode()方法或字节面值:
ser.write(b'70') # 等价于发送十进制[56,48]的字节 # 或 ser.write("70".encode())
如果是将数字转为对应的单个字节(比如数字70对应ASCII字符'F'),则用:
ser.write(bytes([70])) # 发送十进制70对应的字节
修正后的完整代码示例
import serial ser = serial.Serial('/dev/tty.usbmodem14401', 9600) # 发送整数列表对应的字节数组 data = [49, 56, 48] ser.write(bytes(data)) # 发送单个字符'R'对应的字节 ser.write(b'R') # 发送数字80对应的单个字节(ASCII 'P') ser.write(bytes([80]))
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

