C#中的cp210x和modbus多主

问题描述

我通过 Silicon CP210x USB 转 RS485 驱动程序连接到多个设备。一旦通过 USB 分配器插入计算机 USB 端口,每个设备都会收到分配给它的(虚拟)COM。

因此,我们必须通过 Modbus 连接许多设备(每个设备都在自己的 COM 上)。 由于它们每个都有一个不同的 COM,因此它们都应该是 Modbus 主站。因此,对于它们中的每一个,我都创建了一个与特定端口相关联的 Modbus 主对象。该应用程序是用 C# 编写的,并使用 System.IO.Ports。

从设备读取数据的过程是串行化的(因此每个串行端口都被单独询问)例如首先是COM3,然后是COM5,...,但串口保持打开状态。

这种行为很奇怪,有时它使用多个端口而不是 - 有时 - 突然一个/多个/所有通信崩溃并且不再工作(断开/重新连接不能解决它),有时它根本没有即使 COM 端口存在于设备管理器中,也根本无法连接。

所以,我的问题是:

  1. 我应该在每个请求上打开端口-> Modbus 请求 => 关闭端口吗?这会纠正这种行为吗?
  2. 是否有一个“智能分配器”可以将虚拟 COM 与特定的 USB 插头条目关联起来,并确保信号永远不会被“扰乱”理解,不知何故,Silicon CP210x USB 驱动程序?

解决方法

使用 Modbus RTU(串行),您总是必须等待从站响应才能发送另一个请求。

在任何情况下都不能在不等待响应的情况下发送请求。

在串行通信中,没有像以太网那样避免冲突的内在系统,它必须是您的软件来同步维护严格的请求->响应顺序......并且没有必要打开和关闭每次都端口。

既然你用的是RS485,那你为什么要用这么多串口? 从机可以在单个 RS485 网络中,而在 PC 中可以只有一个物理或虚拟串口。