【问题标题】:how to convert integer to binary for serial port如何将整数转换为二进制的串口
【发布时间】:2017-11-18 02:30:56
【问题描述】:

我正在尝试通过串行端口发送一个值。我不确定如何将其转换为正确的格式。我尝试 bin() 用于二进制和 format() 但它没有用。

result = 2
ser.open()
ser.write(b'1')
time.sleep(3)

ser.write(result)                 # wrong format
ser.write("{0:b}".format(result)) # TypeError: unicode strings
                                  # are not supported, please
                                  # encode to bytes: '10'

第一个写操作将“1”作为二进制字符串发送。现在我希望变量也作为二进制字符串发送。

【问题讨论】:

  • 称为字节串。 write() 方法接受字节字符串参数,而不是二进制表示字符串参数。您正在使用的发布模块会有很大帮助,但忘了它。

标签: python serial-port


【解决方案1】:

write() 需要一个字节对象。

>>> help(serial.Serial.write)
Help on function write in module serial.serialwin32:

write(self, data)
    Output the given byte string over the serial port.

要将整数转换为字节,请调用int.to_bytes()

>>> result = 2
>>> b = result.to_bytes(4, 'little')
>>> b
b'\x02\x00\x00\x00'
>>> # to convert back to an integer
>>> int.from_bytes(b, 'little')
2

【讨论】:

    【解决方案2】:

    像这样:

    import binascii
    
    def write(num):
        pack = binascii.unlexlify("%04X"%num)
        ser.write(pack)
    

    重点:设备上使用的数字系统(8、16、32、64位)?

    8 位 = 1 字节(0-255)

    16Bit = 2 字节(0-65535)

    32Bit = 4 Byte(如上行)(0-4294967295)

    所有范围都是UNSIGNED(查找),但float 有额外的定义!

    你不能用键盘输入二进制1值:

    binascii.unlexlify("%01X"%1) 所以等于\x01(当然你可以使用struct 包)

    【讨论】:

      【解决方案3】:

      write() 方法接受一个字符串参数。您可以使用 str() 这样的内置函数将 result 转换为字符串。

      result = str(result)

      Python 2:

      result = 2
      ser.open()
      ser.write(b'1')
      time.sleep(3)
      
      ser.write(str(result))
      

      Python 3:

      您必须以字节为单位对字符串进行编码。

      result = 2
      ser.open()
      ser.write(b'1')
      time.sleep(3)
      
      ser.write(str(result).encode('utf-8'))
      

      【讨论】:

      • 在 Python 3 中,字符串与字节不同。 OP 的代码强烈暗示他只是 Python 3。
      • @Reti43 我不明白你。在 Python 3 中,字符串默认为 Unicode。 OP只想写变量的字符串表示。 OP不想将整数打包成字节,他想把它写成字符串。
      • 正确读取错误。该函数接受一个字符串对象,而是一个字节对象。 TypeError: unicode strings are not supported, please encode to bytes: '10'
      • @Reti43 1. OP 并不暗示他正在使用 Python 3。它也可能是带有from future import unicode 的 Python 2。 2. 将result 转换为以字节为单位的位字符串表示是没有意义的。 3. 我也会更新 Python 3 的答案。
      • 无论他是使用 Python 3 还是 Python 2 中的 unicode,我都会为你高兴,根本的一点是你在函数时建议使用字符串的解决方案(无论 Python 版本如何)明确表示不喜欢。至少你现在已经解决了这个问题,所以你的答案很好。虽然这只是一个小细节,但您的答案有些不正统,因为它将数字转换为字符串并将其转换为字节。一个有 5 位数字的整数最终将有 5 个字节。将数字直接转换为字节表示更直接,但这是吹毛求疵。
      猜你喜欢
      • 2015-04-28
      • 2012-02-27
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2012-04-10
      • 2019-03-29
      • 2020-12-05
      相关资源
      最近更新 更多