我正在通过python的串行端口发送命令,但它们被发送了多次而不是一次

时间:2019-07-16 11:17:29

标签: python python-3.x serial-port

我正在使用com端口串行发送一些具有特定响应的命令。这些命令保存在文件中。我正在逐行读取每个命令并通过com端口串行发送..但是当我我正在使用Magic Terminal(Software)从接收器端看到它。.我发现每个命令执行了多次..我只发送了一次..我在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 个答案:

答案 0 :(得分:0)

您的代码似乎没有错。至少在我可以复制的范围内,它只发送一次命令(在环回设置了串行端口后,我尝试了您的功能)。

我不能肯定地说,但可能是您所使用的终端有两个窗口,一个用于输入,另一个用于输出,不知何故您对进出端口的内容感到困惑。

处理此类问题的一种简单方法是在端口上使用嗅探器。您可以在Windows上结合com0com和Termite来完成,正如我最近解释过的here

如您所见,此终端上只有一个窗口,设置转发后,您将可以进出端口的所有内容。这样应该可以更轻松地查看您的代码正在编写和阅读。

要给您一个常规的应用嗅探器技巧的场景,您可以参考以下屏幕截图:

conventional serial port scenario

在这种情况下,我们的计算机上有两个真实的串行端口。在第一个(COM9上,我们正在运行Modbus服务器(您可以将其想象成一堆内存地址,每个内存地址存储一个16位数字)。在COM10上,有一个客户端正在发送查询,询问前10个地址的内容(使用Modbus术语称为寄存器)。在一般使用情况下,我们使用电缆将这些端口链接在一起,因此(从理论上)我们知道COM10上的客户端正在发送一个数据帧以请求这十个寄存器,而COM9上的服务器是用存储在这些寄存器中的数字应答。但是我们只能看到服务器上的内容(图片的左侧)和客户端正在接收的内容(右侧)。我们看不到的是公共汽车上正在行驶的东西(是的,我们知道它是什么,但是我们不确切知道内部的Modbus协议是什么样子的。)

如果我们想点击总线以查看双方发送和接收的内容,则可以使用com0com创建几个虚拟端口,并使用Termite创建端口转发连接,如下图所示:

port forwarding setup with Termite and com0com

现在,我们已将Modbus服务器移至虚拟串行端口之一(在本例中为COM4)。安装com0com之后,我们得到了(默认情况下,但是您可以更改名称或添加更多端口对)一对转发端口(COM4<-->COM5)。现在,如果要查看端口之间正在流通的内容,请打开Termite(图片的右下角),并设置另一种端口转发方案,在这种情况下,从虚拟端口COM5到实际端口{{ 1}}。

最后(与嗅探之前完全相同),我们用电缆将COM9COM9连接在一起。但是现在我们可以看到总线上来回的所有数据(您在Termite上看到的所有十六进制值都以绿色/蓝色字体显示。)

如您所见,这将提供与more professional tools相似的功能。