Qt modbus 串行端口流量控制处理
Qt modbus serial port flow control handling
我正在串口使用QModbusDevice编写一个小程序(使用QModbusRtuSerialMaster
类(,遇到了一些问题。
问题之一似乎是串口的流量控制不正确。检查串行端口嗅探器时,我看到工作客户端在发送请求时将RTS设置为打开,然后关闭RTS以接收回复。当我使用QModbusRtuSerialMaster
发送消息时,这不会发生。
与工作客户端相比,消息发送正确(有时是另一个问题的主题(。只是控制流不起作用,导致服务器无法回复。
我已经将有问题的COM端口的Windows端口设置设置为硬件流控制,但没关系,嗅探器仍然报告没有流量控制。
有没有办法让QModbusRtuSerialMaster
按照我想要的方式设置流量控制?或者有没有办法手动处理流控制(这是工作客户端所做的(?还是跳过Qt modbus类并直接使用串行端口组成自己的唯一解决方案?
我正在做的事情的简短摘要...
首先初始化QModbusRtuSerialMaster
对象:
QModbusDevice* modbusDevice = new QModbusRtuSerialMaster(myMainWindow);
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3");
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud115200);
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusDevice->setTimeout(100);
modbusDevice->setNumberOfRetries(3);
modbusDevice->connectDevice();
然后我如何发送请求:
auto response = modbusDevice->sendReadRequest(QModbusDataUnit(QModbusDataUnit::Coils, 0, 1), 1);
QtModbus不会为RTS线路实现自动切换,因为它希望您的硬件自行完成(使用专用线路(。
大多数RS485转换器(甚至是便宜的转换器(都应该如此。只有当您有一个像这样带有 DE/~RE 输入的单独收发器时,您才需要 RTS 线路。
如果您在Linux上并且有一些特定的硬件,则可以尝试使用RS485模式自动切换RTS线。但是您似乎不在Linux上,并且支持的硬件肯定非常有限。
您也可以使用port.setRequestToSend(true)
手动切换行,请参阅此处。但请注意,根据您正在谈论的设备的计时需求,此软件解决方案可能不是很可靠。这里已经详细讨论了这个特殊问题。也看看我答案上的链接,我用libmodbus做了一些基准测试,结果很好。
在驱动程序上启用或禁用流控制不会对此问题产生任何影响,因为这实际上不是流控制问题,而是方向控制问题。Modbus经常在双线半双工链路上运行,这意味着您需要一种方法来指示允许哪个设备始终在总线上通话。来自 RS232 端口的 RTS(流量控制(可用于此目的,作为软件解决方法。
最后,如果您只是将收发器替换为支持硬件方向控制的收发器,那就不那么麻烦了。如果您有带有FTDI引擎的串行端口,您应该能够为此目的使用TXEN线路。有时,此硬件线不直接布线,而是在引脚上可用,但您可以使用 MProg 重新布线。
我想强调的是,您没有提到您是否在RS485上运行Modbus。我想假设你是公平的,但是如果你只有几个设备彼此相邻,你可能会使用RS232(即使在TTL级别(而忘记方向控制(你将用三根线运行全双工:TX,RX和GND(。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- Qt modbus 串行端口流量控制处理
- QCoreApplication事件循环和Windows服务控制处理程序功能
- MFC编辑控制消息处理访问文档对象
- 如何处理列表控制标头中的右键单击事件
- 当处理指针时,控制台中为*p1和p显示的不同值的含义
- 如何处理系统链路控制的NM_CLICK
- 如何处理父 CDialog 上的控制消息
- 生产编译器如何在流控制上实现析构函数处理
- 在Linux中寻找流量控制功能(即QOS)库
- 为什么Windows服务控制管理器需要几分钟来处理请求
- 将数据传递给Windows控制台控制处理程序
- Log4X用于流量控制
- 我的C++代码无法处理(一点点)快速的数据流量
- 在CTabCtrl MFC中控制处理
- Mac OS X:观察网络流量(例如处理加载url操作在谷歌浏览器)
- 在C++中,如何控制cin到cout的流量