问题描述
我的笔记本电脑运行一个 Python 程序,该程序读取操纵杆以向 Arduino 发送速度命令,后者反过来控制玩具车上的电机。为此,程序将值在 0 到 255 之间的整数转换为单个无符号字节,然后通过串行连接发送到 Arduino。
这段代码可以做到这一点:
if event.axis == axis:
speed = int((event.value + 1.0) / 2.0 * 255.0)
speedCommand = bytearray(b'\x00')
speedCommand[0] = speed
speedCommand = bytes(speedCommand)
ser.write(speedCommand)
print(speed,speedCommand)
虽然该代码有效,但它不是很优雅。我想找到一个单行指令,它与以“speedCommand”开头的三行指令做同样的事情。我试过这个,例如:
speedCommand = chr(speed).encode()
但它只适用于 0 到 127。任何大于 127 的数字都编码为两个字节[,因为该字符被视为一个有符号字节,大于 127 的值为负]。
编辑补充:我的假设“字符被视为一个有符号字节,大于 127 的值为负”可能不正确。
解决方法
你只需要:
speed_command = bytes([speed])
bytes
构造函数接受 int
对象的可迭代对象,因此在将其传递给构造函数时只需将其放入列表中即可。
您可以使用 pack
内置模块中的 struct
方法。它将格式作为第一个参数,并将一个值(或多个值)打包到此格式中作为下一个参数。对于 unsigned char
,所需的格式为 B
。该模块支持许多其他格式,这对于将其他数据发送到您的 Arduino 可能很有用。请参阅 the struct
module documentation 了解更多信息,包括 a list of format characters。
>>> import struct
>>> speed = 255
>>> struct.pack('B',speed)
b'\xff'