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

时间:2015-05-27 17:52:55

标签: c++ qt

我在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---" ;
}

请你的帮助

1 个答案:

答案 0 :(得分:3)

QSerialPort类继承自QIODevice,其中waitFor...种方法可能正是您所寻找的方法。看看these docs

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

好方法

以下是使用Qt's signals and slots mechanism执行此操作的正确方法。这个不会阻止您的GUI,即使您在等待串口,也可以让您的应用程序响应用户操作。

  1. 将功能连接到bytesWritten信号
    通过串行端口发送数据后要执行的代码应放在此函数中。
  2. 将功能连接到readyRead信号 从串口读取一些数据后要执行的代码应放在此函数中。
  3. 打开端口
  4. 糟糕的方式

    在某些情况下,您可以这样做,但它是阻止,这意味着当您的应用等待串口时,您的GUI将会冻结。我不建议这样做。

    1. 打开端口
    2. 发送数据
    3. 致电waitForBytesWritten
    4. 致电waitForReadyRead
    5. 工作示例代码

      Qt有vast amount of working example code。甚至有examples about how to use QSerialPort,它们非常值得一试。您可能对async writer exampleasync reader example最感兴趣。