首先,因为我需要做一个基于python的视觉系统,需要用到串口通讯,然后就想到了pyserial库,结果没想到里面有太多坑了...
然后我总结一下遇到的坑:
1,关于十六进制发送命令。
2,关于pyserial串口设置的巨坑。
1,关于十六进制发送命令。
我看网上有很多种方法,然后我用的很简单,直接使用bytes.fromhex(),
import serial
ser = serial.Serial("COM8", 921600, 8, "N", stopbits=1)
Pycmd1 = bytes.fromhex("50 4c 41")
ser.write(Pycmd1) # 指令
ser.close()
其实还有更优雅的方法,详情请见优雅的发送十六进制命令。
2,串口设置中的巨坑!
除去在ser = serial.Serial()里面设置端口号,波特率以及检验位和停止位(其实检验位和停止位如果不是采用默认的,估计也有毒),其它设置都是摆设!设置了根本没什么用。
所以建议,像下面一样,只在ser = serial.Serial()设置基本的端口号、波特率、数据位、检验位、停止位,其它的单独设置。例如我使用合宙的Air103 作为下位机,串口通讯需要单独设置RTS电平,在ser = serial.Serial()里面设置rtscts=False,根本没用,Air103收不到消息的。
PS: 实际上,在ser = serial.Serial()设置timeout参数也是毫无卵用的。
import serial
import time
ser = serial.Serial(
port='COM8',
baudrate=921600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE)
ser.setRTS(False)
Pycmd1 = bytes.fromhex("50 4c 41") # PLA
ser.write(Pycmd1)
print(Pycmd1)
time.sleep(0.5)
ser.close()