找回密码
 立即注册
收起左侧

Qt5.7串口接收数据不完整

4
回复
15195
查看
[复制链接]
累计签到:6 天
连续签到:1 天
来源: 2016-12-16 16:26:38 显示全部楼层 |阅读模式
1Qter豆
用qt自带串口写的程序,但在接收数据时,不能一次接受完整的数据。例如发送 01 02 03 04 05,接收时会出现
01 02
03 04 05
分两次接收
void MainWindow::Read_Data(){    times++;    //读取串口数据    QByteArray byte_data=serial->readAll();    //将读取到的数据进行转化    QString strDisplay;
   if(isHexDisplay){  QString str=byte_data.toHex();
    str =str.toUpper();//把小写字符串转换为大写字符串    for(int i=0;i<str.length();i+=2)    {        QString st=str.mid(i,2);        strDisplay +=st;        strDisplay+="";    }    qDebug()<<"16进制接收"<<strDisplay;

回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2016-12-17 08:25:27 显示全部楼层
因为串口本来就不是一次接收完数据,接受数据时需要判断
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2016-12-17 10:33:20 显示全部楼层
dearcc 发表于 2016-12-17 08:25
因为串口本来就不是一次接收完数据,接受数据时需要判断

现在的问题是我只知道数据包的长度,而不知道它的结束标志。我打算采取这个方法:
void MainWindow::Read_Data(){   
   times++;    //读取串口数据  
  QByteArray byte_data=serial->readAll();    //将读取到的数据进行转化   
static QByteArray  a;
  if(a.length()<10)
   a+=bytedata;
else{
   QString str=a.toHex();
   bytedata.clear();
   a.clear();
}
但是并不能保证收到一条完整的数据包;数据包的长度为10;您有没有比较好的方法? 谢谢了

   
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2016-12-19 14:26:11 显示全部楼层
lhs1008 发表于 2016-12-17 10:33
现在的问题是我只知道数据包的长度,而不知道它的结束标志。我打算采取这个方法:
void MainWindow::Read ...

两种方法:
1、在readAll前,判断可读数据等于10后再读,然后再解析。
2、每次都readAll,把数据+=相加,再解析中去每10字节解析一次。
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-12-27 15:54:53 显示全部楼层
串口本身是一个传输比较慢的接口,当底层buf有数据时,就会通知应用层去读取数据,所以当你去读取的时候不一定有你想要的那么多字节,你只有自己去判断。通常我按如下做法实现,前提是传输中无错误数据:
先在*.h中定义两个变量
int readLen;
char buf[10];
然后找个地方赋初值


接收函数如下:

readLen += comPort->read(&buf[readLen],10-readLen);
if(10 == readLen)
{
readLen = 0;
//TODO  这个地方做你想做的处理
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了