我正面临着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协议。
答案 0 :(得分:1)
某些通信硬件只有非常小的片上缓冲区。因此,您经常只能以小爆发的形式获取数据。
许多GPS收发器以这种方式运行,其中许多只能一次产生大约半个k(512字节)的数据。
设备中的串行芯片很可能是硬连线,一次只返回那么多字节,因此您需要继续读取端口,直到字节可用调用返回0字节来读取。
我不记得我头脑中的代码/操作系统调用了,但你可能想看一下你的设备SDK,看看它是否提到有关增加/减少设备缓冲区大小的任何内容,如果它会增加,这可能会增加一次点击返回的数据量。
然而,在您的应用中有一个大缓冲区并且必须通过重复调用设备来逐步填充以收集数据,这并不罕见。
正如你发现“sleep”命令也使得工作正常,那么它可能不是一个缓冲区大小的问题,但可能只是设备填充它的数据缓冲区比你的app /慢得多电脑正在读它。