我正面临着readyRead()的奇怪行为。我使用QextSerialPort进行串行通信,并将readyRead()连接到我的读取槽。例如,我正在向端口写入45个字节,并希望读取45个字节,但是发生的情况是,我的readyRead()信号被多次发出,这意味着它将首先读取38个字节,然后读取7个字节。怎样才能让它读取整个数据块呢?
//Port setup
m_pSerialPort = new QextSerialPort(pduPortName, m_PortSettings, QextSerialPort::EventDriven);
m_pSerialPort->setBaudRate(m_PortSettings.BaudRate);
m_pSerialPort->setDataBits(m_PortSettings.DataBits);
m_pSerialPort->setFlowControl(m_PortSettings.FlowControl);
m_pSerialPort->setParity(m_PortSettings.Parity);
m_pSerialPort->setStopBits(m_PortSettings.StopBits);
m_pSerialPort->setTimeout(500);
m_pSerialPort->flush();
m_pSerialPort->open(QIODevice::ReadWrite | QIODevice::Unbuffered );
connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readSerialData()));
//write
qint64 bytesWritten = pSerialPort->write(data, bytes_to_write);
//Read
qint64 availableBytes = pSerialPort->bytesAvailable();
if (availableBytes >= SIZE)
bytesRead = pSerialPort->read(data , availableBytes);我希望我已经把我的问题解释清楚了。请帮帮我!
注意:我正在使用STANAG协议处理我的消息。
发布于 2011-10-11 01:36:43
一些通信硬件只有非常小的片上缓冲器。因此,您经常只能以较小的突发量返回数据。
许多GPS收发器都是以这种方式工作的,其中许多收发器一次只能产生大约0.5k (512字节)的数据。
设备中的串行芯片很可能一次只返回那么多字节,因此您需要继续读取端口,直到bytes Available调用返回0字节进行读取。
我不记得那些代码/os-call了,但是你可能想看看你的设备SDK,看看它是否提到了增加/减少设备上的缓冲区大小,如果有,那么增加可能会增加一次返回的数据量。
然而,在你的应用程序中有一个很大的缓冲区,并且必须不断地通过反复调用设备来收集数据来填充它,这并不罕见。
由于你已经发现“睡眠”命令也能让事情正常工作,那么它可能不是一个缓冲区大小的问题,然而,它可能只是设备填充它的数据缓冲区的速度比你的应用程序/ pc读取它的速度慢得多。
https://stackoverflow.com/questions/7703419
复制相似问题