Serial port QextSerialPort读取问题

Serial port QextSerialPort读取问题,serial-port,qextserialport,Serial Port,Qextserialport,我正面临readyRead()的一个奇怪行为。我使用QextSerialPort进行串行通信,并将readyRead()与我的读取插槽连接。例如,我正在向端口写入45个字节,并希望读取45个字节,但发生的情况是,我的readyRead()信号被多次发出,这意味着它将先读取38个字节,然后读取7个字节。如何让它读取整个数据块 //Port setup m_pSerialPort = new QextSerialPort(pduPortName, m_PortSettings, QextSerial

我正面临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收发器都是以这种方式工作的,其中许多收发器一次只能产生大约半k(512字节)的数据

很可能您设备中的串行芯片是硬连接的,一次只能返回那么多字节,因此您需要一直读取端口,直到bytes Available call返回0字节读取

我记不起我脑海中的代码/操作系统调用,但您可能想看看您的设备SDK,看看它是否提到增加/减少设备上的缓冲区大小,如果提到,那么增加缓冲区大小可能会增加一次命中返回的数据量

然而,在你的应用程序中有一个大的缓冲区,并且必须通过反复调用设备来收集数据来逐步填充缓冲区,这并不少见


正如您发现的那样,“sleep”命令也可以使事情正常运行,那么这可能不是缓冲区大小的问题,但是,可能只是设备在填充数据缓冲区时比应用程序/电脑读取数据缓冲区时慢得多。

我在开始读取端口之前添加了sleep(1),现在它可以正常工作。我需要找到更好的解决办法。我也面临着这个问题。。。你有好转吗solution@ArunKumarKS事实上,就我记忆所及,我通过循环直到读取预期的字节来修复它。