在Qt中等待数据从串口到达

wait for data arrive from serial port in Qt

本文关键字:串口 数据 Qt 等待      更新时间:2023-10-16

我在qt应用程序中使用串口连接。我的问题-在发送命令后,我无法获得控制(或值来自通信端口)。

我有一个名为serial.cpp的类,负责串口连接。这个类包含2个队列。一个用于从通信端口保存字节,第二个用于解码消息。该类具有以下函数:

void Serial::sendCommand(QString s)
{
    QString sometext = s;
    QByteArray ba = QByteArray::fromHex(sometext.toLatin1());
    serial->write(ba);
}
void Serial::serialReceived()
{
    QByteArray ba ;
    serialArray = serial->readAll();
    for (int i=0; i<sizeof(serialArray);i++)
    {
        queueBytes.enqueue(serialArray[i]);  // queue for saving the bytes
    }
    QVector<int> vect = queueBytes.toVector();
    packetSize = 6;
    if (vect.size() >= packetSize)
    { // the whole packet arrived
        for (int i =0 ;i<packetSize;i++)
        {
            item = queueBytes.dequeue();
            ba.append(item);
        }
    }
    if (ba.toHex() == "12ee02010176")
        queueMsgs.enqueue("ACK");
    // ... and so on
}

下面是调用类:

void Engine::onNewMessageFromAppReceived(int msgId,QString args)
{
    serial->sendCommand("ee1203190209005569");
    while (serial->queueMsgs.size() == 0) // infinite loop-the queue is always empty
    {
        usleep(1);
    }
    QVector<QString> vect2 = serial->queueMsgs.toVector();
    qDebug() << vect2 << "get ack---" ;
}

请帮忙

QSerialPort类继承自QIODevice,其中waitFor...方法可能是您正在寻找的。看看这些文档。

如果您想异步处理串行端口,请使用readyRead信号并在连接到该信号的函数中执行读取。如果你不介意操作阻塞,waitForReadyRead函数就是你要找的。

好方法

这是使用Qt的信号和插槽机制的正确方法。这个将不会阻塞您的GUI,并让您的应用程序响应用户的操作,即使你在等待串行端口。

  1. 连接bytesWritten信号
    通过串口发送数据后要执行的代码应该放在这个函数中。
  2. 连接readyRead信号从串口读取数据后要执行的代码应该放在这个函数中。
  3. 打开端口

不好的方式

在某些情况下,你可以这样做,但它是阻塞,这意味着你的GUI将冻结,而你的应用程序正在等待串行端口。我不建议你这样做。
  1. 打开端口
  2. 呼叫waitForBytesWritten
  3. 呼叫waitForReadyRead

工作示例代码

Qt有大量的工作示例代码。甚至还有关于如何使用QSerialPort的示例,它们非常值得一试。您可能对异步写入器示例和异步读取器示例最感兴趣。