我正在尝试通过串行端口发送数据。对于控制流程,我需要手动设置和清除RTS线路:发送数据时将其设置(RTS开启),发送完毕并准备好接收答复时将其清除(RTS关闭)。

我使用的代码基本上是

serialPort->setRequestToSend(false);
serialPort->write(reinterpret_cast<char*>(package.data()), package.size());
serialPort->flush();
serialPort->setRequestToSend(true);


变量packageQVector<int8_t>,但这与问题无关。上面的代码每五秒钟在计时器中调用一次。

问题在于直到下一次我发送消息时,我才需要立即发生RTS关闭。

请参阅以下嗅探日志:

10:11:06 +00:06.301   Set RTS: on
10:11:06 +00:06.302 < 0000  01 01 00 01 00 01 ac 0a                          ........
10:11:11 +00:11.300   Set RTS: off
10:11:11 +00:11.300   Set RTS: on
10:11:11 +00:11.301 < 0000  01 01 00 01 00 01 ac 0a                          ........
10:11:16 +00:16.300   Set RTS: off
10:11:16 +00:16.301   Set RTS: on
10:11:16 +00:16.301 < 0000  01 01 00 01 00 01 ac 0a                          ........


从日志中可以看到,RTS开启仅在我发送邮件时正确发生,但RTS直到下一次发送才关闭。

flush调用无关紧要,在flush之后添加另一个setRequestToSend(true)调用也无济于事。尝试阅读之后也无济于事。

我是否需要连接到特殊信号才能知道何时可以调用setRequestToSend来关闭RTS?我是否需要使用Windows本机串行端口功能来设置/清除RTS?还是我只是做错了什么,或者对setRequestToSend函数和QSerialPort的工作方式或一般的串行端口有一些误解?

供参考,这是我配置串行端口的方式:

serialPort->setDataBits(QSerialPort::Data8);
serialPort->setBaudRate(QSerialPort::Baud115200);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setFlowControl(QSerialPort::NoFlowControl);


而且端口也可以打开。



一些背景知识:我正在尝试替换一个已经过时的现有程序,并且在从Windows XP移植到Windows 10时也遇到了问题。它使用本机Windows串行端口功能进行读取和写入,以及手动处理RTS的开/关。它使用RS232到RS485转换器(内部制造)与Modbus设备通信。旧程序可以设置和清除RTS,没有问题,但是使用QSerialPort的替换程序却不能。我想避免获取RTS问题的本机Windows句柄,但是除非有其他解决方案,否则我将这样做。

我正在32位模式下使用Qt 5.6.3和VisualC ++ 2017(14.16.27023),因为我希望该程序与仍在使用的较旧Windows XP系统兼容。

最佳答案

事实证明,直到程序返回事件循环,才真正写入数据(包括RTS关闭标志)。或者调用waitForBytesWritten函数。

所以代码现在看起来像

serialPort->setRequestToSend(true);
serialPort->write(reinterpret_cast<char*>(package.data()), package.size());
serialPort->waitForBytesWritten(100);
serialPort->setRequestToSend(false);


现在应该适当地“发送” RTS开和RTS关。

关于c++ - QSerialPort手动RTS开/关未同步调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57768009/

10-14 06:59