您的代码似乎没有任何问题。至少在我可以重现的范围内,它只发送一次命令(我在环回设置串行端口后尝试了你的功能)。
我不能肯定地说,但可能是您使用的终端有两个窗口,一个用于输入,另一个用于输出,不知何故您对端口进出的内容感到困惑。
处理此类问题的一种简单方法是在您的端口上使用嗅探器。您可以在 Windows 上将 com0com 和 Termite 结合使用,正如我最近解释的 here。
如您所见,此终端上只有一个窗口,设置转发后,您将看到进出端口的所有内容。这样可以更轻松地查看您的代码正在编写和读取的内容。
为了给您一个应用嗅探器技巧的常规场景,您可以参考以下屏幕截图:
在这种情况下,我们在计算机上有两个真正的串行端口。在第一个 (COM9) 上,我们正在运行一个 Modbus 服务器(您可以将其想象为一堆内存地址,每个地址都存储一个 16 位数字)。在COM10 上,我们有一个客户端正在发送查询,询问前 10 个地址的内容(使用 Modbus 术语称为寄存器)。在一般用例中,我们将这些端口与电缆相连,因此我们知道(理论上)COM10 上的客户端正在发送一个数据帧,要求这十个寄存器,而COM9 上的服务器正在回答这些数字存储在这些寄存器上。但是我们只能看到服务器上的内容(图片左侧)和客户端正在接收的内容(右侧)。我们看不到总线上正在运行的是什么(是的,我们知道它是什么,但我们不知道 Modbus 协议在内部是什么样子的)。
如果我们想点击总线以查看每一侧发送和接收的内容,我们可以使用 com0com 创建几个虚拟端口,并使用 Termite 创建一个端口转发连接,类似于以下屏幕截图:
现在我们已将 Modbus 服务器移至虚拟串行端口之一(在本例中为COM4)。安装 com0com 后,我们得到(默认情况下,但您可以更改名称或添加更多端口对,当然)一对转发端口(@987654332@)。现在,如果我们想查看通过端口循环的内容,我们打开 Termite(图片右下方)并设置另一个端口转发方案,在本例中是从虚拟端口 COM5 到真实端口 COM9。
最后(与我们嗅探之前完全相同),我们将COM9 与COM10 用电缆连接在一起。但是现在我们可以看到总线上来回的所有数据(您在 Termite 上看到的所有 HEX 值都以绿色/蓝色字体显示)。
如您所见,这将提供类似于您可以使用 more professional tools 执行的操作。