为什么QSerialPort read()方法没有按预期工作?

时间:2015-12-08 06:20:30

标签: qt serial-port

我要将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;
}

你能解释为什么第二个代码不起作用。

2 个答案:

答案 0 :(得分:1)

仅当有数据可用时,

waitForReadyRead()才会返回true。在第二种情况下,while循环有时间在收到所有数据之前执行两次。使用QSerialPort::bytesAvailable查看要读取的数据量。

答案 1 :(得分:0)

看来,第一次调用waitForReadyRead()来检查串口上是否有数据要读取时,它会返回true,但是你应该在读取串口后的整个数据你调用那个方法是因为如果你在调用waitForReadyRead()之后无法读取整个数据,那么下次调用该方法时,它会返回false,尽管还有一些数据需要从端口读取。 / p>

所以我的第二个代码应该改为:

_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;
    }
}