为什么 QSerialPort read() 方法不能按预期工作?
why QSerialPort read() method doesn't work as expected?
我要将 5 个字节的数据写入 COM 端口,并期望接收到 11 个字节,最后一个字节为 0xFF。我将接收字节存储在 pantilt_value
变量中。
这是一个有效的代码:
(我收到了预期的 11 个字节,最后一个字节为 0xFF)
_port->write(data_pantilt, 5);
QByteArray pantilt_value = _port->readAll();
while (_port->waitForReadyRead(100))
pantilt_value.append(_port->readAll());
这是一个无效的代码:
(我只收到前 2 个字节)
_port->write(data_pantilt, 5);
char d;
QByteArray pantilt_value;
while (_port->waitForReadyRead(100)){
_port->read(&d,1);
pantilt_value.append(d);
if (d == 0xff)
break;
}
你能解释一下为什么第二个代码不起作用吗?
waitForReadyRead()
returns true
仅当有 new 数据可用时。在第二种情况下,while 循环有时间在接收到所有数据之前执行两次。使用QSerialPort::bytesAvailable
查看有多少数据要读取。
好像是,第一次调用waitForReadyRead()
查看串口有没有数据要读,是returnstrue
,但是应该是读完整个调用该方法后串口上的数据,因为如果调用waitForReadyRead()
后未能读取全部数据,下次调用该方法时,它returns false
,虽然还有一些数据留给从端口读取。
所以我的第二个代码应该改成这样:
_port->write(data_pantilt, 5);
char d;
QByteArray pantilt_value;
while(_port->waitForReadyRead(100)){
while (_port->bytesAvailable() > 0){
_port->read(&d,1);
pantilt_value.append(d);
if (d == 0xff)
break;
}
}
我要将 5 个字节的数据写入 COM 端口,并期望接收到 11 个字节,最后一个字节为 0xFF。我将接收字节存储在 pantilt_value
变量中。
这是一个有效的代码: (我收到了预期的 11 个字节,最后一个字节为 0xFF)
_port->write(data_pantilt, 5);
QByteArray pantilt_value = _port->readAll();
while (_port->waitForReadyRead(100))
pantilt_value.append(_port->readAll());
这是一个无效的代码: (我只收到前 2 个字节)
_port->write(data_pantilt, 5);
char d;
QByteArray pantilt_value;
while (_port->waitForReadyRead(100)){
_port->read(&d,1);
pantilt_value.append(d);
if (d == 0xff)
break;
}
你能解释一下为什么第二个代码不起作用吗?
waitForReadyRead()
returns true
仅当有 new 数据可用时。在第二种情况下,while 循环有时间在接收到所有数据之前执行两次。使用QSerialPort::bytesAvailable
查看有多少数据要读取。
好像是,第一次调用waitForReadyRead()
查看串口有没有数据要读,是returnstrue
,但是应该是读完整个调用该方法后串口上的数据,因为如果调用waitForReadyRead()
后未能读取全部数据,下次调用该方法时,它returns false
,虽然还有一些数据留给从端口读取。
所以我的第二个代码应该改成这样:
_port->write(data_pantilt, 5);
char d;
QByteArray pantilt_value;
while(_port->waitForReadyRead(100)){
while (_port->bytesAvailable() > 0){
_port->read(&d,1);
pantilt_value.append(d);
if (d == 0xff)
break;
}
}