我正在通过 python 中的串行端口发送命令,但它们被发送多次而不是一次
- 2025-04-15 09:19:00
- admin 原创
- 29
问题描述:
我正在使用 com 端口串行发送一些具有特定响应的命令..这些命令保存在一个文件中..我正在逐行读取文件中的每个命令并通过 com 端口串行发送它..但是当我使用 Magic Terminal(软件)从接收端看到它时..我发现每个命令都会运行多次..而我只发送一次..我已经在 pycharm 中编写了一个代码..在控制台中我看到该命令只运行一次但从 uart 接收端来看情况就不同了..我被这个问题困住了..我保持了相同的波特率和一切,但无法诊断问题..代码的 github 链接是:https: //github.com/AkshatPant06/Akshat-Pant/blob/master/cmd%20list
def recvResponse():
ser.write(serial.to_bytes(intCmd))
time.sleep(1)
data_recv=ser.read(2)
return data_recv
我已经用它来接收 2 字节响应。
解决方案 1:
你的代码似乎没什么问题。至少在我能复现的范围内,它只发送了一次命令(我在设置串口为环回模式后尝试了你的函数)。
我不能肯定地说,但可能是您使用的终端有两个窗口,一个用于输入,另一个用于输出,不知何故您对端口的输入和输出感到困惑。
处理此类问题的一个简单方法是使用嗅探器来检测端口。你可以在 Windows 上结合使用 com0com 和 Termite 来实现,正如我最近在这里解释的那样。
如您所见,此终端上只有一个窗口,设置转发后,您将看到所有进出端口的信息。这样可以更轻松地查看代码的写入和读取内容。
为了给你一个应用嗅探器技巧的常规场景,你可以参考以下屏幕截图:
在本例中,计算机上有两个真实的串行端口。在第一个端口(COM9
)上,我们运行着一个 Modbus 服务器(您可以将其想象成一堆内存地址,每个地址存储一个 16 位数字)。在 上,COM10
我们有一个客户端正在发送查询,询问前 10 个地址(在 Modbus 术语中称为寄存器)的内容。在一般情况下,我们用电缆连接这些端口,因此我们(理论上)知道 上的客户端正COM10
在发送一个数据帧,询问这 10 个寄存器,而 上的服务器COM9
正在使用这些寄存器中存储的数字进行应答。但我们只能看到服务器上的内容(图片左侧)和客户端正在接收的内容(图片右侧)。我们看不到总线上传输的内容(是的,我们知道它是什么,但我们不知道 Modbus 协议的内部结构)。
如果我们想点击总线来查看每一侧发送和接收的内容,我们可以使用 com0com 创建几个虚拟端口,并使用 Termite 创建端口转发连接,如下面的屏幕截图所示:
现在,我们已将 Modbus 服务器移至其中一个虚拟串口(COM4
在本例中)。安装 com0com 后,我们获得了一对转发端口(COM4<-->COM5
)(默认情况下,但您当然可以更改名称或添加更多端口对)。现在,如果我们想查看端口间的数据流通情况,可以打开 Termite(图片右下角)并设置另一个端口转发方案,在本例中是从虚拟端口COM5
到真实端口COM9
。
最后(和之前嗅探完全一样),我们用一根电缆COM9
连接起来了COM10
。不过现在我们能够看到总线上所有来回的数据(所有在 Termite 上看到的十六进制值都以绿/蓝字体显示)。
正如您所见,这将提供与您使用更专业的工具所能做的事情类似的功能。
扫码咨询,免费领取项目管理大礼包!