在与一些仪器设备进行通讯时,有些时候需要写入十六进制的命令,是不能直接发送字符串的方式,那么我们如何向端口写入十六进制的bytes数据呢?
写入十六进制数据
- 如果只是已知的少数几个命令,我们可以hardcode方式去写入串口, 如下:
import serial
# Connect to Device.
device = serial.Serial(
port='/dev/cu.usbserial-FTAWJMLQ',
baudrate=57600,
bytesize=8,
parity='N',
stopbits=1,
timeout=5,
write_timeout=5,
)
# Set DTR home.
device.write(bytearray([0x00, 0x10, 0x02, 0x01, 0x13]))
注意:
上面使用的bytearray()方法接受的这个数组,数组内容必须是十六进制的数,而不是十六进制的字符串,否则就会抛出类型出错的异常
- 如果存在很多个命令,上面的方式就会带来很多不便;而且我们最常用到的命令类型都是字符串,那么我们就需要将十六进制的字符串先转换成十六进制的bytes,然后再写入,如下:
... # init device as before
hexStr = "0010020113"
# convert hex to bytes
bytes_hex = bytes.fromhex(hexStr)
device.write(bytes_hex)
# Alternative method
device.write(bytearray(bytes_hex))
为什么上面两个方法,一个写入的是bytes,另外一个写个的是bytearray,这两种方式都可以呢?
因为bytes是byte的序列,bytearray除了显示的类型和bytes是不一样的,数据是一致的,serial.write()方法发送data,并返回发送字节数。如果bytes和bytearray可用,则接受其作为参数;否则接受str作为参数。所以bytes和bytearray写到串口结果是一样的。