记录下几种常见的坑
1.timeout与sleep的相对时间设置的不对
if __name__ == '__main__':
#创建端口对象
ser =serial.Serial()
try:
#传入参数
ser = serial.Serial("COM5", 115200, timeout=0.01)
#连续发送信息
while 1:
#传入一个16进制数组
ser.write(bytes([0x01, 0x04, 0x01, 0xA1, 0x00, 0x17, 0xE0, 0x1A]))
#设置发送间隔时间为0.3s
time.sleep(0.3)
#打印输出的16进制信息
#print(hexShow(ser.read_all()))
print(hexArray(ser.read_all()))
except Exception as e:
print('端口连接失败,错误原因:\n',e)
#关闭串口
sys.exit()
这里的代码中,timeout为0.01,sleep为0.3,让我们看看运行结果
如果我们将timeout设置为0.3,sleep设置为0.01,也就是timeout>sleep的情况,再让我们看看结果
01 04 2e 00 39 00 2f 00 40 00 00 00 32 00 6e 00 00 00 0a 00 64 00 00 00 0a 00 d2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0f 00 00 0a dd
58 72 02 27 00 23 00 40 00 00 00 32 00 5a 00 00 00 0a 00 6e 00 00 00 0a 00 96 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0f 00 00 a3 b0
01 04 2e 00 27 00 23 00 40 00 00 00 32 00
50 00 00 00 0a 00 82 00 00 00 00 00 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0f 00 00 9a 88
#以下省略无数行
结论:一般情况下,timeout都设置为0.01较为稳妥,但是具体能不能设置为0.01还需要根据波特率自己调试,但是sleep的设定最好不要远小于timeout,这样会造成读取数据异常
2.串口连接异常
如果串口没有连接好,很容易出现串口连接成功但是不出数据的现象,在看到串口成功连接但是却没有数据产生,应该看看传输线连接好了没有,我有好几次调试了半天没有出数据才发现原来是串口的一根线断了,虽然断了一根线但是COM口还是可以正常连接的!
3.串口没有打开
串口通信编程一定要牢记流程:
(1)实例化串口
(2)设置串口参数
(3)打开串口
(4)写入数据
(5)读取数据
(6)关闭串口
(ps:养成随手关流的好习惯)
cushy-serial是一个轻量级的Serial框架,初衷是希望使Serial编程变得更加简单、快捷,因此,相较于传统的pyserial,该框架可以更加快速地构建起一个serial程序,其可以兼容pyserial的所有特性,并且自定义serial消息异步回调,无需花费精力在多线程上,项目地址:https://github.com/Undertone0809/cushy-serial
pip install cushy-serial --upgrade
from cushy_serial import CushySerial
serial = CushySerial("COM1", 9600)
serial.send("I am python client")
@serial.on_message()
def handle_serial_message(msg: bytes):
str_msg = msg.decode("utf-8")
print(f"[serial] rec msg: {str_msg}")
需要说明的是,CushySerial兼容了Serial中所有的功能,因此,你可以在CushySerial中使用Serial的所有功能。