我面临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协议。
一些通信硬件只有非常小的片内缓冲器。因此,您通常只能在小的突发事件中获得数据。
许多GPS收发器都是以这种方式工作的,其中许多接收器一次只能产生大约0.5 k(512字节)的数据。
设备中的串行芯片很可能一次只返回那么多字节,因此您需要继续读取端口,直到bytes Available调用返回0字节才能读取。
我记不起代码/os调用,但你可能想看看你的设备SDK,看看它是否提到了增加/减少设备上的缓冲区大小,如果有,那么增加可能会增加一次命中返回的数据量。
在你的应用程序中有一个大的缓冲区,并且必须通过反复调用设备来收集数据来逐渐填充它,这并不罕见。
当你发现"sleep"命令也使事情工作,那么它可能不是缓冲区大小的问题,然而,它可能只是设备在填充它的数据缓冲区比你的应用程序/pc读取它慢得多。