def recvResponse():
ser.write(serial.to_bytes(intCmd))
time.sleep(1)
data_recv=ser.read(2)
return data_recv
我曾经用来接收2字节的响应。
答案 0 :(得分:0)
您的代码似乎没有错。至少在我可以复制的范围内,它只发送一次命令(在环回设置了串行端口后,我尝试了您的功能)。
我不能肯定地说,但可能是您所使用的终端有两个窗口,一个用于输入,另一个用于输出,不知何故您对进出端口的内容感到困惑。
处理此类问题的一种简单方法是在端口上使用嗅探器。您可以在Windows上结合com0com和Termite来完成,正如我最近解释过的here。
如您所见,此终端上只有一个窗口,设置转发后,您将可以进出端口的所有内容。这样应该可以更轻松地查看您的代码正在编写和阅读。
要给您一个常规的应用嗅探器技巧的场景,您可以参考以下屏幕截图:
在这种情况下,我们的计算机上有两个真实的串行端口。在第一个(COM9
上,我们正在运行Modbus服务器(您可以将其想象成一堆内存地址,每个内存地址存储一个16位数字)。在COM10
上,有一个客户端正在发送查询,询问前10个地址的内容(使用Modbus术语称为寄存器)。在一般使用情况下,我们使用电缆将这些端口链接在一起,因此(从理论上)我们知道COM10
上的客户端正在发送一个数据帧以请求这十个寄存器,而COM9
上的服务器是用存储在这些寄存器中的数字应答。但是我们只能看到服务器上的内容(图片的左侧)和客户端正在接收的内容(右侧)。我们看不到的是公共汽车上正在行驶的东西(是的,我们知道它是什么,但是我们不确切知道内部的Modbus协议是什么样子的。)
如果我们想点击总线以查看双方发送和接收的内容,则可以使用com0com创建几个虚拟端口,并使用Termite创建端口转发连接,如下图所示:
现在,我们已将Modbus服务器移至虚拟串行端口之一(在本例中为COM4
)。安装com0com之后,我们得到了(默认情况下,但是您可以更改名称或添加更多端口对)一对转发端口(COM4<-->COM5
)。现在,如果要查看端口之间正在流通的内容,请打开Termite(图片的右下角),并设置另一种端口转发方案,在这种情况下,从虚拟端口COM5
到实际端口{{ 1}}。
最后(与嗅探之前完全相同),我们用电缆将COM9
与COM9
连接在一起。但是现在我们可以看到总线上来回的所有数据(您在Termite上看到的所有十六进制值都以绿色/蓝色字体显示。)
如您所见,这将提供与more professional tools相似的功能。