• 【QT】关于QSerialPort的错误处理 (Error Handling)及错误类型


    QSerialPortQt 框架中用于串口通信的类,它提供了与串行端口进行数据读写和配置的功能。这个类封装了底层操作系统对串口的处理,使得开发者可以方便地在跨平台应用中实现串口通信。

    回顾:

    写数据 (Writing Data)

    要向串口写数据,首先需要打开串口并配置相关参数(如波特率、数据位、校验位等)。写数据通常使用 write() 方法。例如:

    QSerialPort serial;
    serial.setPortName("COM1");
    serial.setBaudRate(QSerialPort::Baud9600);//数值越大, 传输速率越快
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    
    if (serial.open(QIODevice::ReadWrite)) {
        serial.write("Your data here");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    读数据 (Reading Data)

    读取数据通常在 readyRead() 信号触发时进行。你可以连接此信号到一个槽函数,每当有新数据到达时,槽函数就会被调用。在槽函数中,你可以使用 read()readAll() 方法来获取数据。

    QObject::connect(&serial, &QSerialPort::readyRead, [&]() {
        QByteArray data = serial.readAll();
        // 处理数据
    });
    
    • 1
    • 2
    • 3
    • 4

    本节重点

    错误处理 (Error Handling)

    QSerialPort 提供了 errorOccurred() 信号来报告错误。这个信号在出现错误时被触发,并提供一个 QSerialPort::SerialPortError 枚举值,表示发生的错误类型。

    错误类型包括:

    • QSerialPort::NoError:没有错误。
    • QSerialPort::DeviceNotFoundError:找不到设备。
    • QSerialPort::PermissionError:没有足够的权限。
    • QSerialPort::OpenError:打开设备时出错。
    • QSerialPort::ParityError:奇偶校验错误。
    • QSerialPort::FramingError:帧错误。
    • QSerialPort::BreakConditionError:断线条件错误。
    • QSerialPort::WriteError:写数据时出错。
    • QSerialPort::ReadError:读数据时出错。
    • QSerialPort::ResourceError:设备被意外移除或系统资源不足。
    • QSerialPort::UnsupportedOperationError:不支持的操作。
    • QSerialPort::UnknownError:未知错误。
    • QSerialPort::TimeoutError:操作超时。
    • QSerialPort::NotOpenError:尝试操作一个未打开的设备。

    可以连接 errorOccurred() 信号到一个槽函数来处理错误:

    QObject::connect(&serial, &QSerialPort::errorOccurred, [&](QSerialPort::SerialPortError error) {
        if (error == QSerialPort::ResourceError) {
            qDebug() << "串口错误:" << serial.errorString();
            serial.close();
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
      QString  ERRORString ;
    switch (error) {
               case QSerialPort::NoError:
                   ERRORString=  "No Error";
            break;
               case QSerialPort::DeviceNotFoundError:
                   ERRORString= "Device Not Found";
                   break;
               case QSerialPort::PermissionError:
                   ERRORString= "Permission Denied";
                   break;
               case QSerialPort::OpenError:
                   ERRORString= "Open Error";
                   break;
               case QSerialPort::ParityError:
                   ERRORString= "Parity Error";
                   break;
               case QSerialPort::FramingError:
                   ERRORString= "Framing Error";
                   break;
               case QSerialPort::BreakConditionError:
                   ERRORString= "Break Condition";
                   break;
               case QSerialPort::WriteError:
                   ERRORString= "Write Error";
                   break;
               case QSerialPort::ReadError:
                   ERRORString= "Read Error";
                   break;
               case QSerialPort::ResourceError:
                   ERRORString= "Resource Error";
                   break;
               case QSerialPort::UnsupportedOperationError:
                   ERRORString= "Unsupported Operation";
                   break;
               case QSerialPort::UnknownError:
                   ERRORString= "Unknown Error";
                   break;
               case QSerialPort::TimeoutError:
                   ERRORString= "Timeout Error";
                   break;
               case QSerialPort::NotOpenError:
                   ERRORString= "Not Open Error";
                   break;
               default:
                   ERRORString= "Other Error";
           }
        qDebug()<<"SerialPortWorker::errorOccurred  ,info is  "<<ERRORString;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    错误处理是串口通信中非常重要的部分,它可以帮助诊断和解决通信问题,确保应用程序的稳定性和可靠性。

  • 相关阅读:
    怎么找到贵人?
    Native崩溃说明 so库崩溃、SIGBUS(bad memory access) 和 SIGSEGV(Invalid memory reference)
    Jetpack Compose中的Constraint Layout
    HackTheBox-Starting Point--Tier 1---Sequel
    【计算机操作系统】编程实现FCFS
    SQL常用数据过滤---IN操作符
    计算机网络篇之TCP滑动窗口
    智能网关在校园能耗监测系统中的应用介绍
    CVE-2022-39227jwt伪造
    浅谈面向对象
  • 原文地址:https://blog.csdn.net/weixin_44939430/article/details/136328031