Qt串⼝通信开发之QSerialPort模块Qt串⼝通信接收数据不
完整的解决⽅法
在使⽤串⼝接收数据时,当数据量⼤的时候会出现数据接收不完整的情况。
因为串⼝数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串⼝读到起始标志时⽴即发送,并不保证⼀定是当前所发数据的起始部分。
因此串⼝通信双⽅在通信前应制定好通信协议,规定好数据的起始和结束标志,串⼝当读到完整的起始和结束标志之后,才认定读完⼀条完整的数据。
本例中⽤串⼝定时发送当前时间,⽤"#"表⽰数据的结尾,定时时间为0毫秒,即能发多快就发多快。
发送
void Widget::slotSendData()
{qt进程间通信
QByteArray temp;
temp.append(getCurrentTime());
temp.append("#");
serialPort->write(temp);
}
接收
void Widget::slotReadData()
{
QByteArray temp = serialPort->readAll();
if(!temp.isEmpty())
{
byteArray.append(temp);
ains("#"))
{
ui->textEditReceive->setText(byteArray.split('#').at(0));
byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1);
}
}
}
下⾯是⼀个通过串⼝传输图⽚的例⼦
这⾥假设波特率为9600,那么⼀秒钟就能传输9600/8=1200字节。代码中将定时器设置为1秒,所以选择的图⽚应该⼩于1200字节。
这⾥为了演⽰如何完整接收数据,将图⽚按照指定⼤⼩分段发送,在每段之后紧接着发送字符串“###”。
代码如下所⽰:
void Widget::slotSendData()
{
QPixmap tempPixmap = ansformed(matrix);
QBuffer buffer;
tempPixmap.save(&buffer,"jpg");
ui->labelImage->setPixmap(tempPixmap);
char *data=(char*)buffer.data().data();
int dataLength=buffer.data().length();
//打印图⽚⼤⼩
qDebug()<<"Image Size:"<<dataLength;
int standPacketSize=120;
int packetSize=0;
int packetNum=ceil(dataLength/120.0);
if(dataLength>120)
{
for(int i=0;i<packetNum;i++)
{
if(standPacketSize*(i+1)<dataLength)
{
packetSize=standPacketSize;
}
else
{
packetSize=dataLength-standPacketSize*i;
}
serialPort->write(data,packetSize);
data=data+packetSize;
}
}
serialPort->write("###",3);
}
运⾏效果如下图所⽰:
本⽂主要介绍了QSerialPort模块Qt串⼝通信接收数据不完整的解决⽅法,更多关于Qt串⼝通信知识请查看下⾯的相关链接