繁体   English   中英

Qt modbus串口流量控制处理

[英]Qt modbus serial port flow control handling

我正在通过串口(使用QModbusRtuSerialMaster类)使用QModbusDevice编写一个小程序,并遇到一些问题。

其中一个问题似乎是串口的流量控制不正确。 检查串口嗅探器我发现有效的客户端在发送请求时设置RTS,然后关闭RTS以接收回复。 当我使用QModbusRtuSerialMaster发送不会发生的消息时。

与工作客户端相比,消息发送正确(有时,另一个问题)。 只是控制流不起作用,导致服务器无法回复。

我已经将有问题的COM端口的Windows端口设置设置为硬件流控制,但没关系,嗅探器仍然没有报告流量控制。

有没有办法让QModbusRtuSerialMaster按照我的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转换器(即使是便宜的转换器)应该是这种情况。 如果你有一个像一个独立的收发器,你只需要RTS行这一个带有DE / RE〜输入。

如果你在Linux上并且有一些特定的硬件,你可以尝试使用RS485模式自动为你切换RTS线。 但是你似乎不在Linux上,支持的硬件肯定非常有限。

您也可以使用port.setRequestToSend(true)手动切换该行,请参见此处 但请注意,根据您所说的设备的时序需求,此软件解决方案可能不太可靠。 这个问题已经在这里详细讨论过 看看我的答案上的链接,我用libmodbus做了一些基准测试,结果很好。

启用或禁用驱动程序上的流控制不会对此问题产生任何影响,因为这实际上不是流控制问题,而是方向控制问题。 Modbus经常在双线半双工链路上运行,这意味着您需要一种方法来指示允许哪个设备始终在总线上通话。 来自RS232端口的RTS(流量控制)可用作软件变通方法。

最终,这将是更头疼的,如果你只是更换您的收发器一个支持硬件方向控制。 如果您有一个带有FTDI引擎的串行端口,您应该可以使用TXEN线来实现此目的。 有时,此硬件线路不会直接路由并在引脚上可用,但您可以使用MProg重新路由它。

我想强调你没有提到你是否在RS485上运行Modbus。 我想假设你是公平的,但如果你只有几个设备彼此相邻,你可能会使用RS232(即使在TTL电平上)而忘记了方向控制(你将使用三条线运行全双工:TX ,RX和GND)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM