首页 > 其他分享 >QT串口QSerialPort类循环接收可能导致的数据接收不到问题。

QT串口QSerialPort类循环接收可能导致的数据接收不到问题。

时间:2023-10-11 11:11:21浏览次数:32  
标签:responseData readAll QT readBytes result 串口 接收 size

QT串口QSerialPort类循环接收可能导致的数据接收不到问题。

建议在使用readAll前调用bytesAvailable来判断缓存区数据是否存在。

下面这个程序为错误示范,可能会导致串口数据一直无法读取。

QByteArray responseData;
if(m_serialport->isOpen())
{
  m_serialport->waitForReadyRead(1);
  responseData = m_serialport->readAll();//读取串口数据
  if(responseData.size() > 0)//判断读取字节数大于0
  {
    emit this->response(responseData);//发送信号给主窗口
  }
}

正确示范

QByteArray responseData;
if(m_serialport->isOpen())
{
  m_serialport->waitForReadyRead(1);
  if(m_serialport->bytesAvailable())//判断串口缓存区内部是否存在数据,存在数据再将数据读出来
  {
    responseData = m_serialport->readAll();//读取串口数据
    if(responseData.size() > 0)//判断读取字节数大于0
    {
      emit this->response(responseData);//发送信号给主窗口
    }
  }
}

 分析原因可能是QSerialPort类继承了QIODevice类,QIODevice的readAll获取到数据长度为0,但是此时恰好串口有数据进来导致状态出错,具体原因希望有大佬可以分析一下。

QIODevice::readAll()源代码实现如下:

QByteArray QIODevice::readAll()
{
    Q_D(QIODevice);
#if defined QIODEVICE_DEBUG
    printf("%p QIODevice::readAll(), d->pos = %d, d->buffer.size() = %d\n",
           this, int(d->pos), int(d->buffer.size()));
#endif

    QByteArray result;
    qint64 readBytes = 0;

    // flush internal read buffer
    if (!(d->openMode & Text) && !d->buffer.isEmpty()) {
        result = d->buffer.readAll();
        readBytes = result.size();
        d->pos += readBytes;
    }

    qint64 theSize;
    if (d->isSequential() || (theSize = size()) == 0) {
        // Size is unknown, read incrementally.
        qint64 readResult;
        do {
            result.resize(result.size() + QIODEVICE_BUFFERSIZE);
            readResult = read(result.data() + readBytes, result.size() - readBytes);
            if (readResult > 0 || readBytes == 0)
                readBytes += readResult;
        } while (readResult > 0);
    } else {
        // Read it all in one go.
        // If resize fails, don't read anything.
        result.resize(int(readBytes + theSize - d->pos));
        readBytes += read(result.data() + readBytes, result.size() - readBytes);
    }

    if (readBytes <= 0)
        result.clear();
    else
        result.resize(int(readBytes));

    return result;
}

 

标签:responseData,readAll,QT,readBytes,result,串口,接收,size
From: https://www.cnblogs.com/jeremy2016/p/17756453.html

相关文章

  • 轻量通讯协议 --- MQTT
    介绍一、MQTT简介MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,通常用于在物联网(IoT)和传感器网络中进行通信。它设计用于在低带宽、不稳定或高延迟的网络环境下传输数据,因此非常适用于连接设备之间的通信,尤其是在资源有限的环境中。MQTT的主要特点包括......
  • 【PyQt6】Python窗口拖拽文件并响应的实现
    情景大概应用情景为:将一个文件拖入到窗口内,地址栏显示文件路径,文本框显示文件内容。说明实现拖拽必须在exec前设置QMineDate,否则不会开始拖拽操作。实现fromPyQt6.QtCoreimport*calssMainWindow(QMainWindow,Ui_MainWindow): def__init__(self): super().__init__......
  • Qt学习随笔-3、QMainWindow
       1 QMainWindow   1.1 菜单栏最多只能有一个      1.1.1 创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针            QMenuBar*bar=MenuBar();      1.1.2 setMenuBar(bar);  ......
  • 解决方案 | 罗技无线鼠标同型号如何重新对码,罗技鼠标接收器丢了怎么办?
    问题 有一个罗技m185鼠标,但是鼠标的usb接收器丢了,如何解决。解决方法①找一个同品牌,同型号(M185)的鼠标接收器,没有的话可以网上(闲鱼或者tb)买一个接收器,大概10元。(注意不同品牌以及同品牌的不同型号之间一般是无法对码的不用试了);②下载Logitech连接实用程序(适用于非优联的鼠......
  • C#通过MQTT与其他物联网设备通信
    转自:https://blog.csdn.net/polsnet/article/details/130302374MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在C#中,我们可以使用MQTT库来实现与其他物联网设备之间的通信,本文将介绍如何使用C#中的MQTT库进行通信。一、安装M......
  • 从串口读取数据的注意事项
    从串口一次可以读4096个字节的数据。如果读取时间间隔很长,串口会积累大量数据,可能会超过4096个字节。如果读取时间间隔很短,那么可能产生的数据很少,甚至没有数据。因此,需要确定合适的读取时间。对于读取的数据要仔细观察结果是16进制数据还是字符串数据。注意数据产生的时间先后顺序......
  • QT常用控件之QTimer,QDialog,QLabel,QLineEdit,QProgressBar,QComboBox,QPushButton,QGridLay
    QT常用控件的组合#ifndefPROGRESSBARWIDGET_H#definePROGRESSBARWIDGET_H#include<QWidget>#include<QTimer>#include<QDialog>#include<QLabel>#include<QLineEdit>#include<QProgressBar>//显示进度条的控件#include<QComboBo......
  • 模型视图简介、QListWidget、QTreeWidget、QTableWidget、QStringListModel、QFileSys
    一、模型视图简介   有时,我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的Qt要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改的地方写回,然后......
  • Qto_SpaceBaseQuantities
    Qto_SpaceBaseQuantities空间基准量:定义所有引用的空间时通用的基准量。  NameTypeDescriptionHeightQ_LENGTHHöheGesamteHöhedesRaums,vonRohbodenzurRohdecke,wirdnurangegebenwennderRaumeinekonstanteHöhehat.HeightTotalheight......
  • Qt学习随笔-2、Qt中的对象树、坐标系、信号和槽
       1 对象树  1.1 当创建的对象在堆区的时候,如果指点的父亲是QObject派生下来的类或QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入对象树中。  1.2 一定程度上简化了内存回收机制。       2 Qt中的坐标系  2.1 左上......