QSerialPort:读取不正确的值

时间:2016-07-29 10:46:46

标签: c++ qt

我正在编写一个程序来读取QSerialPort。该程序似乎在85%的时间内起作用,但是出现了一种奇怪的情况,其中废话被读入我的缓冲区。

由于x00值的大量缓冲,有时程序会在启动时意外崩溃。这不是我模块的响应,只是偶尔会在启动时发生。

我认为我删除QSerialPort实例的方式存在问题,但似乎无法找到它。

我还注意到QSerialPort有一个函数“sendBreak”,它似乎正在执行我的程序(发送大量的x00 / x00 / x00)。

我的问题是:有没有人遇到过这个?有没有奇怪的可能性我的QSerialPort :: read()函数以某种方式执行“sendBreak”?或者这看起来更像是删除实例/指针的问题(从未正确解构的地址读取数据)?

构造

 serial = new QSerialPort;
    serial->setPortName("/dev/ttyUSB0");
    serial->setBaudRate(QSerialPort::Baud9600); // 9600
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    serial->open(QSerialPort::ReadWrite);
    serial->clear(QSerialPort::AllDirections);

阅读端口:

readData.append(serial->read(50));

析构函数:

serial->clear(QSerialPort::AllDirections);
serial->close();
delete serial;

我意识到这可能是一个非常普遍的问题,但我目前无法找到问题所以任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好的,我发现了这个问题。

重新阅读QSerialPort上的Qt文档,特别是read()函数后,它说:

"此功能无法报告错误;返回一个空的QByteArray可能意味着当前没有数据可用于读取,或者发生错误。"

似乎一直在发生的事情是,即使我没有要读取数据,我的readyRead()信号也会被触发?!在readPort方法中检查bytesAvailable()的简单if语句意味着只有在我等待读取数据时才会读取。

我很惊讶这个功能无论如何都会读到,并且觉得这个问题可以更好地突出/处理......

编辑:发现这个问题的真正问题。我正在使用readData.resize()清除数组而不实例化它。因此,当我在阅读之前清除它(但没有初始化)时,它正在读取一个地址。