首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QextSerialPort读取问题

QextSerialPort读取问题
EN

Stack Overflow用户
提问于 2011-10-09 20:15:25
回答 1查看 2.8K关注 0票数 2

我正面临着readyRead()的奇怪行为。我使用QextSerialPort进行串行通信,并将readyRead()连接到我的读取槽。例如,我正在向端口写入45个字节,并希望读取45个字节,但是发生的情况是,我的readyRead()信号被多次发出,这意味着它将首先读取38个字节,然后读取7个字节。怎样才能让它读取整个数据块呢?

代码语言:javascript
复制
//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协议处理我的消息。

EN

回答 1

Stack Overflow用户

发布于 2011-10-11 01:36:43

一些通信硬件只有非常小的片上缓冲器。因此,您经常只能以较小的突发量返回数据。

许多GPS收发器都是以这种方式工作的,其中许多收发器一次只能产生大约0.5k (512字节)的数据。

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

我不记得那些代码/os-call了,但是你可能想看看你的设备SDK,看看它是否提到了增加/减少设备上的缓冲区大小,如果有,那么增加可能会增加一次返回的数据量。

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

由于你已经发现“睡眠”命令也能让事情正常工作,那么它可能不是一个缓冲区大小的问题,然而,它可能只是设备填充它的数据缓冲区的速度比你的应用程序/ pc读取它的速度慢得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7703419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档