python - 我在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
解决方案
阅读器的精简版和扩展版之间的唯一区别是,在后者中,您将命令发送到另一端的设备两次:
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 或任何其他语言实现某种流控制、硬件或软件。缺点是您需要在链路的两侧都支持和实施流控制。如果您想完全确保您的数据顺利流动,流量控制是您的最佳选择。
- 降低波特率
推荐阅读
- python - 从 df.columns 重命名值
- html - 为什么我的 .bb 类不能处理输入标签?
- php - 如何在 laravel-8 中将图像作为链接存储在我的数据库中,以便在前端 Vue.js 中使用?
- .net - Inriver PIM - 工作区根文件夹为空
- python - selenium 如何在没有本地保存的情况下将屏幕截图上传到远程?
- java - 如何使用 Eclipse 制作 Android 应用程序
- javascript - 在 R 中单击传单中的按钮时显示摘要统计信息
- python - python-binance:获取所有订单,不指定符号
- salesforce - 即使案例停止,如何处理里程碑计时器仍在闪电运行?在销售人员中
- java - “无法连接到 Browsermob-Proxy 出现代理错误。” 在Linux中