2016-07-29 135 views
0

我在写一个程序从QSerialPort读取。该程序似乎在大约85%的时间内工作,然而出现了一种奇怪的情况,在这种情况下,废话被读入我的缓冲区。QSerialPort:读取不正确的值

有时由于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

许多事情都可能出错。如果串口打开,您是否在第一次读取之前检查?你在用waitForReadyRead吗? –

+0

发送NULL和'break'不一样。 '休息'是线条在零延长的时间段内(超过几个字符时间)变为零。休息时没有开始位,所以接收者不应该看到任何字符,甚至NULL。要查看一串空字符,每个字符都需要一个关联的起始位。噪声(表现为错误的起始位)可能会导致您的问题或串口驱动程序问题,或者另一端可能确实发送了一串NULL值。 – Mark

+0

我使用readyRead()知道何时从端口读取,但是不使用waitForReadyRead()。我没有检查串口是否首先打开,但是如果它没有打开(我没有得到),我会得到一个错误。谢谢你关于休息的信息,不了解操作。我似乎没有一个驱动程序问题,我可以说,该模块不应该发送这种数据蒸汽(联系制造商关于此)。这些评论后,我倾向于认为它可能是一个readyRead()问题...我听说它可能有问题。 – SamMetix

回答

0

好的,为什么它值得我发现问题。

上QSerialPort重新阅读Qt文档和专门的阅读()函数,它说后:

“这个函数没有报告错误的方式;否则,返回一个空的QByteArray可能意味没有数据是目前可用于阅读或发生错误。“

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

我很惊讶,无论这个函数读取和感觉这个问题可能已经凸显/处理好....

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