【发布时间】: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