我正在编写一个程序来读取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;
我意识到这可能是一个非常普遍的问题,但我目前无法找到问题所以任何帮助将不胜感激。
答案 0 :(得分:0)
好的,我发现了这个问题。
重新阅读QSerialPort上的Qt文档,特别是read()函数后,它说:
"此功能无法报告错误;返回一个空的QByteArray可能意味着当前没有数据可用于读取,或者发生错误。"
似乎一直在发生的事情是,即使我没有要读取数据,我的readyRead()信号也会被触发?!在readPort方法中检查bytesAvailable()的简单if语句意味着只有在我等待读取数据时才会读取。
我很惊讶这个功能无论如何都会读到,并且觉得这个问题可以更好地突出/处理......
编辑:发现这个问题的真正问题。我正在使用readData.resize()清除数组而不实例化它。因此,当我在阅读之前清除它(但没有初始化)时,它正在读取一个地址。