2011-10-09 99 views
2

我面临着readyRead的怪异的行为()。我使用QextSerialPort进行串行通信,并将readyRead()与我的阅读插槽连接。例如,我写了45个字节到端口,期望读取45个字节,但是发生了什么,我的readyRead()信号被多次发送,这意味着它将首先读取38个字节,然后读取7个字节。我怎样才能让它读取整个数据块?QextSerialPort阅读问题

//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

我在开始阅读端口之前添加了sleep(1),现在它工作。我需要找到一个更好的解决方案。 – newbieLinuxCpp

+0

我也面临这个问题... 难道你有什么更好的解决办法 –

+0

@ArunKumarKS其实据我记得,我通过循环,直到读的预期字节固定它。 – newbieLinuxCpp

回答

1

一些通信硬件只有很小的片上缓冲器。结果,你往往只能以小爆发获得数据。

很多GPS收发器以这种方式操作,其中许多一次只生产数据的大约一半A K(512个字节)。

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

我不记得代码/ os调用关闭了我的头,但你可能想看看你的设备SDK,看看它是否提及增加/减少设备上的缓冲区大小,如果确实如此,那么增加可能会增加一次命中返回的数据量。

这是不寻常然而,在你的应用程序大的缓冲,并具有与重复调用设备来收集数据增量填充它。

正如您发现“睡眠”命令也在使事情起作用,那么它可能不是一个缓冲区大小问题,但它可能只是因为设备在填充数据缓冲区时比设备缓慢得多/ pc正在阅读它。