首页 > 解决方案 > 我在python中使用串行通信模块..但是接收到的数据不正确..它不稳定并且大部分时间都在变化

问题描述

我的基本任务是从文件中读取一些命令,在读取这些命令后,我必须使用串行模块将这些命令串行发送到串行端口..我为这个项目创建了许多 API..包括从文件中读取,将其转换为我从文件中读取到 int 形式的数据以使其发送到串行端口,然后通过 UART 相应地接收响应,该 UART 以这样的方式编程,它为它收到的每个命令提供特定的响应..我能够发送和接收大多数命令,但对于我将获得的响应中的一个命令,有一个与之关联的 4kb 数据..所以当我使用此命令运行我的项目时,我无法正确接收该数据(我得到了不稳定的数据)但是当我制作一个程序来单独发送该命令时(没有其他API),即我只使用发送功能来发送该命令和接收功能来获取响应..然后我能够正确地获得响应..我测试了很多次但直到现在我无法调试它..这将是一个伟大的如果有人帮助我,请帮助我..

我的完整代码的链接如下 https://github.com/AkshatPant06/Akshat-Pant/blob/master/fileAPI.py

我仅发送单个命令并获得正确响应的代码链接如下: https ://github.com/AkshatPant06/Akshat-Pant/blob/master/working%20file%20for%20a%20single%20cmd

我试图更改时间延迟和超时值,但这在整个程序中不起作用

我希望得到完整的数据作为回报..您还可以通过此文档查看我想要的实际 o/p 以及我得到的内容 https://github.com/AkshatPant06/Akshat-Pant/blob/master/README .md

标签: pythonpython-3.x

解决方案


阅读器的精简版和扩展版之间的唯一区别是,在后者中,您将命令发送到另一端的设备两次:

def recvCmd(mode):
    ser.write(serial.to_bytes(intCmd))            # Send command to the other side
    time.sleep(0.5)
    if mode==None:
        data_recv=ser.read(2)
        return data_recv
    elif mode==1:                                 # This is the mode that triggers the 4 Kb response
        ser.write(serial.to_bytes(intCmd))        # You send the command A SECOND TIME!
        time.sleep(1)
        data=b''
        timeout=time.time()+3.0
        while ser.inWaiting() or time.time()-timeout<0.0:
            if ser.inWaiting()>0:
                data+=ser.read(ser.inWaiting())
                timeout=time.time()+3.0
        return data
    elif mode==0:
        ser.write(serial.to_bytes(getDataBuff()))
        resp=ser.read(2)
        return resp

您的阅读代码与您的阅读器的两个版本一样好。没有理由让一个工作正常而另一个失败。

如果您无法解决删除重复写入的问题,您可能需要:

- 增加 RX 缓冲区的大小(仅适用于 Windows),请参见此处,您可以使用ser.set_buffer_size(rx_size = size_bigger_than_4_Kb)和/或使用 Windows 控制面板来完成。我从未尝试过,但对于已知的一次性非连续交换,这可能会有所帮助。

- 尝试使用不同的编程语言。在其他地方你说你用不同的软件运行这个。Python 非常好和高效,但它可能不是你想要做的最好的。

- 使用 Python 或任何其他语言实现某种流控制、硬件或软件。缺点是您需要在链路的两侧都支持和实施流控制。如果您想完全确保您的数据顺利流动,流量控制是您的最佳选择。

- 降低波特率


推荐阅读