QT学习笔记 -->接受一帧数据并不是一次接受完,分多次接受

一帧数据多次接受处理方法

在使用Qt自带的串口QtSerialPort时。其发送过来的数据需要进行接受,则需要连接一个相应的槽函数:

  //连接槽函数,当有串口数据来时,进入槽函数。
    connect(serial,SIGNAL(readyRead()),this,SLOT(Read_Data()));

其中只要是串口中有数据,便会执行Read_Data()槽函数,并不是说一帧数据发送完了,才执行一次Read_Data()函数。其不稳定的进入
如图所示:
这里写图片描述
其中主要的问题根源是:用了消息映射,readyRead()一旦有数据就会发送,所以你接收数据时接受的数据量是不能确定的。
readyRead信号不是每接收到一个字节就发出的,而是连续的一串数据或是几个数据之后。这就造成了数据的不完整。

[解决办法]
1.如果知道包长的话,根据包长度来确认数据接收完

2.另一种方法,给每包加上包头和包尾,根据包头包尾确认包接收完

下面给出一个超时处理机制

在mainwindow.h中添加:
    QByteArray myData2; //读取串口数据并叠加数据是B型的
    QByteArray Readdata;//读取到的原始叠加后的数据
    QSerialPort *serial;
    QTimer *myTimer2;  //计时器2

mainwindow.c中:

myTimer2 = new QTimer(this); //建立串口读写超时定时器
connect(myTimer2,SIGNAL(timeout()),this,SLOT(TimerUpdate_COM()));//必须要有的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//超时候处理数据。。。。
void Widget::TimerUpdate_COM()
{
    myTimer2->stop(); 

    qDebug()<<"需要处理的数据"<<Readdata.toHex();
    /*
        数据处理
    */
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//串口读取数据
void Widget::readData()
{ 
    myTimer2->start(600);//600ms启动定时器,具体时间按调试来
    Readdata = myData2.append(MyCom->readAll());//读串口缓区QByteArray数据 关键是append
    qDebug()<<Readdata.toHex()<<"转换结束";//读取数据并转换,此时读取完毕后已经得到了整合后的数据
}

这样,即采样固定的时间读取一帧数据,其在TimerUpdate_COM()函数中,进行数据的处理。
由于采用了append()

Readdata = myData2.append(MyCom->readAll());//读串口缓区

因此myData2会把所有的到的数据都进行累加,
如果不需要将前一帧数据添加到后一帧数据中,只需要处理一帧数据,则在超时处理中,将myData2的数据清除掉。添加

myData2.clear();

具体可参考贴吧大神:
http://tieba.baidu.com/p/3699753033?pn=2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值