【问题标题】:Read all input from QSerialPort从 QSerialPort 读取所有输入
【发布时间】:2015-10-29 16:24:03
【问题描述】:

我正在接收这种形状的数据:

Q1\n
9.70E-6\n
OK>

通过 QSerialPort 从外部设备,但使用我的阅读程序

QString request = "Hello";
qDebug() << "TransAction started!";
QByteArray requestData = request.toLocal8Bit();
qDebug() << "Writing data: " << requestData;
serial->write(requestData);
qDebug() << "Data written";
if(serial->waitForBytesWritten(waitTimeout))
{
     if(serial->waitForReadyRead(waitTimeout))
                {
                    qDebug() << "Waiting for data!";
                    QByteArray responseData = serial->readAll();
                    while(serial->waitForReadyRead(100))
                        responseData += serial->readAll();
                    responseData.replace('\n', ' ');
                    QString response(responseData);
                    QByteArray response_arr = response.toLocal8Bit();
                    qDebug() << "Response is: " << response_arr.toHex();
                    emit this->response(response);
                }
                else
                {
                    qDebug() << "Wait read response timeout";
                    emit this->timeout(tr("Wait read response timeout %1").arg(QTime::currentTime().toString()));
                }
            }
            else
            {
                qDebug() << "Wait write request timeout!";
                emit this->timeout(tr("Wait write request timeout %1").arg(QTime::currentTime().toString()));
            }

我只知道

Q1

作为回应。如何修改我的代码以便能够读取所有输入数据?
更新:
使用此处描述的串行端口脚本进行测试时:https://stackoverflow.com/a/7654527/2546099,一切正常。显然问题是 qt-version 在第一个换行符后停止读取。如果我添加

char buffer[1000];
                    for(int i = 0; i < 1000; i++)
                    {
                        int tmp = serial->read(buffer, 1000);
                        if(tmp > 0)
                            qDebug() << buffer;
                    }

直接在该行之后

qDebug() << "Waiting for data!";

然后我仍然只得到第一行(没有\n)。更改时间不会更改接收到的数据。

【问题讨论】:

  • 这很正常,串口很慢,所以你经常只能得到几个字节。许多设备传输行尾指示符,通常是“\n”。这使您可以使用 readLine() 而不是 readAll()。
  • @HansPassant:那么这里的问题是我在一次传输中得到了两个\n(在Q1 和数值后面)。为了获取所有数据,我假设我必须调用 readLine() 三次。对吗?
  • 您是否尝试过使用任何其他串行端口阅读器,例如realterm,只是为了确保您一次性接收到您期望的所有数据?这发生在我身上,过了一段时间我才意识到这个问题。
  • @ramtheconqueror:当使用cutecom时,我得到了我想要的所有数据(即问题第二行中显示的接收数据)。
  • 如果你让循环中的 100 毫秒等待时间更高,比如 1 秒,有什么变化吗?也许其他设备很慢,并且在线路之间等待超过 100 毫秒?

标签: qt serial-port


【解决方案1】:

这个问题(部分)描述了我的问题的答案:External vs internal declaration of QByteArray。我的问题(为什么我没有收到任何进一步的数据)是我没有在输入行之后发送\x00D,因此设备只是回显了我的输入,然后等待Enter。在输入看起来与第一行完全一样之后,我误解了它只是获取第一行,没有别的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2018-08-07
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多