为什么 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;
    }
}