python serial串口调试中的可能会产生的一些数据读取异常的问题

调试记录

记录下几种常见的坑
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

cushy-serial是一个轻量级的Serial框架,初衷是希望使Serial编程变得更加简单、快捷,因此,相较于传统的pyserial,该框架可以更加快速地构建起一个serial程序,其可以兼容pyserial的所有特性,并且自定义serial消息异步回调,无需花费精力在多线程上,项目地址:https://github.com/Undertone0809/cushy-serial

  • 快速上手
pip install cushy-serial --upgrade 
  • 下面是一个简单的serial程序,当python客户端接收到来自串口的信息时会自动回调
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的所有功能。

  • 运行结果如下
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
### 回答1: 这个问题可能是因为串口未正确打开或未正确设置串口参数所导致的。请检查串口是否已正确打开,检查串口的波特率、数据位、停止位、校验位等参数是否与发送端设置的一致。另外,还需检查串口线是否连接正常,是否存在干扰等问题。如果以上问题都不存在,可以尝试更换串口线或更换电脑来测试。 ### 回答2: Pythonserial库是用于处理串口通信的库。当串口不能接收到数据时,可能导致代码执行“卡住”的情况。出现这个问题的原因可以有以下几种情况: 1. 串口未正确打开或关闭: 在使用串口通信前,需要确保串口已经成功打开并正确配置。没有正确打开串口,或者没有在程序结束后关闭串口,可能导致串口接收数据时的卡顿问题。 2. 波特率设置不匹配: 串口通信,发送方和接收方的波特率需要保持一致。如果发送方数据的波特率与接收方不符,接收方无法正确解析数据,从而导致卡住的情况。 3. 串口缓冲区溢出: 当数据发送速度大于接收速度时,可能导致接收缓冲区溢出。当缓冲区满时,接收函数可能等待缓冲区有足够的空间来接收新数据,从而导致程序卡顿。 为了解决这个问题,可以尝试以下方法: 1. 检查串口的打开和关闭过程,确保正确打开和关闭串口。 2. 检查发送方和接收方的波特率设置,保持一致。 3. 使用串口库提供的方法来检查缓冲区状态,避免缓冲区溢出。可以通过查询串口缓冲区可读的字节数,或者设置串口的超时时间来避免卡顿问题。 4. 在接收数据的循环,增加超时机制,当一定时间内没有接收到数据时,可以跳出循环,避免程序一直等待。 总结:如果Pythonserial库无法接收到串口数据而卡住,可以先检查串口的打开和关闭过程,确保正确打开和关闭串口。同时要检查波特率设置是否匹配,避免串口解析数据错误。此外,可使用库提供的方法检查缓冲区状态,避免缓冲区溢出的情况发生。如果以上方法无效,可以尝试增加超时机制来避免代码卡住。 ### 回答3: 在Python,当串口未接收到数据时,程序可能卡住的原因有多种可能性。下面列出了一些常见的解决方法: 1. 串口设置错误:首先,确保你的串口设置正确。包括串口号、波特率、数据位、校验位、停止位等参数。你可以使用串口调试助手或其他串口工具来验证串口设置是否正确。 2. 读取超时设置:检查你的代码是否设置了正确的读取超时时间。如果读取超时时间设置过短,当串口没有接收到数据时,程序立即超时,并卡住。你可以尝试延长超时时间,例如将读取超时时间设置为较大的值,或者设置为None表示无限等待。 3. 缓冲区问题:当串口接收数据时,可能需要使用缓冲区来存储接收到的数据,直到你读取并清空缓冲区。如果你没有及时读取缓冲区数据,缓冲区可能满,导致串口卡住。因此,务必在适当的时候读取和清空缓冲区。 4. 读取方式问题:检查你使用的读取方式是否正确。通常,在Python,可以使用`read()`或`readline()`方法来读取串口数据。确保你使用的方法适合你的数据格式,并及时处理读取到的数据。 5. 其他硬件或驱动问题:如果以上方法都无效,可能存在其他硬件或驱动问题。你可以尝试使用另一台电脑或更换串口线或串口模块,以确认是否与硬件有关。 总而言之,串口接收不到数据导致卡住的问题可能涉及多个方面,从串口设置到代码逻辑等都需要进行仔细检查和排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeeland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值