当前位置:   article > 正文

如何处理qt中接收来自串口数据不完整的情况_qt串口读取数据不完整

qt串口读取数据不完整

一、遇到的问题

我们在使用qt的时候想读取串口里的数据,一般都会使用这样的方式。

  1. QByteArray rxbuffer;
  2. rxbuffer.append(serial.readALL());

但是我们串口助手一次是8个比特位,一次性读取的数据会不全。你读取到的数据可能是这样的。

作为一个不完整的数据去后续解析工作,会导致解析不出来正常的数据,因为解析的数据不是正常的起始位,校验位,截止位,我们把这种数据称为无效数据。

二、解决方法

我想到了一种解决方法,并非传统意义上的通过延时函数的方法去解决数据收发不完整的情况。而是定义一个静态的数组去存储不完整的数据,对每一次不完整的数据进行拼接,直到出现起始位和结束位都满足条件的时候,进入解析。我这里的起始位是“$”开头,“\r\n”结尾。

  1. GPSInfo gpsInfo;
  2. QByteArray rxbuffer;
  3. static QByteArray incompleteData;
  4. incompleteData.append(serial1.readAll());
  5. rxbuffer.append(incompleteData);
  6. incompleteData.clear();
  7. // qDebug() << "rxbuffer" << rxbuffer << endl;
  8. int endPos = rxbuffer.indexOf("\r\n");
  9. while (endPos != -1) {
  10. QByteArray sentence = rxbuffer.left(endPos); // 不包括结束标志
  11. rxbuffer.remove(0, endPos + 2); // 移除已经处理的数据,包括结束标志
  12. endPos = rxbuffer.indexOf("\r\n");
  13. if (sentence.startsWith("$")) {
  14. // qDebug()<<"SENTENCE"<<sentence;
  15. switch (minmea_sentence_id(sentence.constData(), false)) {
  16. case MINMEA_SENTENCE_RMC: {
  17. ...
  18. ...
  19. }
  20. break;
  21. }
  22. case MINMEA_SENTENCE_HDT: {
  23. if (minmea_parse_hdt(&frame_hdt, sentence.constData())) {
  24. ...
  25. ...
  26. }
  27. break;
  28. }
  29. case MINMEA_SENTENCE_GGA: {
  30. if (minmea_parse_gga(&frame, sentence.constData())) {
  31. gpsInfo.time = get_double_number(sentence.mid(GetComma(1, sentence)));
  32. ...
  33. ...
  34. }
  35. break;
  36. }
  37. default:
  38. break;
  39. }
  40. }
  41. }
  42. incompleteData.append(rxbuffer); // 将剩余的不完整数据保存下来

三、运行结果

最后运行结果通过qDebug()打印,只有检测到完整的数据才会进入sentence进行后续解析。如图所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/132988?site
推荐阅读
相关标签
  

闽ICP备14008679号