如何将串行端口的整数转换为二进制

时间:2017-11-17 12:48:04

标签: python serial-port

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

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'作为二进制字符串现在我希望变量也作为二进制字符串发送。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

write()方法接受字符串参数。您可以将result转换为带有str()内置函数的字符串,如下所示。

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'))

答案 2 :(得分:1)

像这样:

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包)