【问题标题】:In Python, how can I convert an integer between 0 and 255 to a single unsigned byte? [duplicate]在 Python 中,如何将 0 到 255 之间的整数转换为单个无符号字节? [复制]
【发布时间】:2021-07-06 10:29:22
【问题描述】:

我的笔记本电脑运行一个 Python 程序,该程序读取操纵杆以向 Arduino 发送速度命令,而 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 为负数”可能不正确。

【问题讨论】:

  • " 因为该字符被视为一个有符号字节,大于 127 的值为负数。"我不认为这是怎么回事,无论如何,我已经提供了答案
  • 仅供参考 speed = chr(speed).encode('latin1') 将解决您的编码问题。否则编码默认为utf8
  • Mark Tolonen,chr(speed).encode('latin1') 解决方案确实适用于我的程序。很高兴知道。

标签: python type-conversion integer unsigned-char


【解决方案1】:

你只需要:

speed_command = bytes([speed])

bytes 构造函数接受 int 对象的可迭代对象,因此在将它传递给构造函数时只需将其放入列表中即可。

【讨论】:

    【解决方案2】:

    您可以使用struct 内置模块中的pack 方法。它将一个格式作为第一个参数,并将一个值(或多个值)作为下一个参数以打包成这种格式。对于unsigned char,所需格式为B。该模块支持许多其他格式,这可能有助于将其他数据发送到您的 Arduino。请参阅the struct module documentation 了解更多信息,包括a list of format characters

    >>> import struct
    >>> speed = 255
    >>> struct.pack('B', speed)
    b'\xff'
    

    【讨论】:

    • struct 模块是向 Arduino 发送数据的好方法。我可以在我的程序中的其他几个地方使用它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2014-03-27
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多