2

我正面临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 协议。

4

1 回答 1

1

一些通信硬件只有非常小的片上缓冲区。因此,您通常只能以小批量方式获取数据。

许多 GPS 收发器都以这种方式运行,其中许多收发器一次只能产生大约一半 ak(512 字节)的数据。

您设备中的串行芯片很可能是硬连线的,一次只返回那么多字节,因此您需要继续读取端口,直到字节可用调用返回 0 个字节来读取。

我不记得我头顶上的代码/操作系统调用,但是您可能想查看您的设备 SDK,看看它是否提到了有关增加/减少设备上的缓冲区大小的任何内容,如果有的话增加可能会增加一次命中返回的数据量。

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

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

于 2011-10-10T17:36:43.490 回答