具体的实现方法是在串口传输完成后的回调函数内部增加一段延时。
1. 自定义槽函数的声明:
void onDataWritten(qint64 bytes);
2. 使用连接器连接回调函数,如下:
connect(serialPortPLC, &QSerialPort::bytesWritten, this, &PLCCommunication::onDataWritten);
3. 回调函数的实现:
void PLCCommunication::onDataWritten(qint64 bytes)
{
qDebug() << bytes << " bytes written.";
// 计算延迟时间
int baudRate = BUATERATIO; // 波特率
int dataLength = bytes; // 发送的字节数
int delayMs = (dataLength * 10 * 1000) / baudRate; // 发送所需时间,单位毫秒
// 使用 QTimer::singleShot 创建一次性定时器,延时后执行操作
QTimer::singleShot(delayMs, [this]()
{
// 定时器回调:切换 GPIO 引脚到接收模式
deviceInfo->gpioContol.set_gpio_value(GPIO_PIN_OUT_485RE, GPIO_PIN_RS485_RECEIVE);
qDebug() << "Switch to receive mode."; });
}
注:最好是使用定时器的方式,不会阻塞当前的线程。