首页 > 其他分享 >基于Qt的串口调试工具&串口常见问题

基于Qt的串口调试工具&串口常见问题

时间:2024-09-23 08:52:31浏览次数:1  
标签:常见问题 QByteArray QMap QSerialPort SerialPortWrap 串口 include Qt

1.项目地址

https://github.com/zhangjiechina001/SerialPortTool

2.使用注意

  1. 串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确,设置错了有时会连接上但是传输的数据会很奇怪,有时直接连接不上了
  2. 串口通信中一般不需要像网络通信那样明确的保活机制(Keep-alive),因为串口通信是基于硬件的点对点连接,没有复杂的中间路由设备或网络超时的问题。然而,在某些场景下,使用保活机制还是有意义的,尤其是在需要保持长时间稳定通信的场景下,以防止通信中断或检测设备故障。实现方式:
    心跳包: 定期发送一小段固定的数据,等待接收方的响应。如果没有在一定时间内收到响应,可以重新建立连接或处理错误。
    超时机制: 如果在规定时间内没有接收到数据或响应,触发超时处理。
    错误检测: 结合串口的错误处理机制,例如 QSerialPort::timeout() 或 QSerialPort::error(),可以检测到超时或其他错误。
    在大多数简单的串口应用中,保活机制可能不是必需的。但对于长时间运行或对可靠性要求较高的应用,引入保活机制能提高系统的健壮性。

3.串口通讯参数解释

串口通讯(Serial Communication)是一种逐位传输数据的通信方式,常见于计算机与外部设备(如传感器、微控制器等)之间的通信。串口通讯的参数包括以下几个常见项:

  1. 波特率(Baud Rate):
    波特率表示每秒传输的符号数(位元数),即每秒钟可以传输多少个比特。常见的波特率有9600、19200、115200等。发送端和接收端必须使用相同的波特率。

  2. 数据位(Data Bits):
    数据位表示每次传输的实际数据位数,通常是5到8位。最常见的是8位数据位(即一个字节),用于传输一个完整的字符。

  3. 停止位(Stop Bits):
    停止位用于标志一帧数据的结束,常见的停止位为1位或2位。停止位的作用是给接收端一些时间来处理接收到的数据,并为下一帧做准备。

  4. 校验位(Parity Bit):
    校验位用于检测传输过程中是否出现错误。常见的校验方式有:
    无校验(None):不使用校验位。
    偶校验(Even Parity):如果传输的数据位中“1”的个数是偶数,校验位为0;否则为1。
    奇校验(Odd Parity):如果传输的数据位中“1”的个数是奇数,校验位为0;否则为1。

  5. 流控制(Flow Control):
    流控制用于控制数据的传输速率,确保接收方有足够的时间处理数据。常见的流控制方式包括:
    无流控制(None):不进行流控制。
    软件流控制(XON/XOFF):通过特殊的控制字符(XON 和 XOFF)来控制数据的传输。
    硬件流控制(RTS/CTS):使用额外的控制线(RTS 和 CTS)来协调数据的发送和接收。
    起始位(Start Bit):

  6. 起始位用于标志数据帧的开始,通常为1位。在传输数据之前,发送端会发送起始位,接收端以此为标志开始接收数据。

这些参数通常需要在通信的双方(如计算机和串口设备)之间进行配置,以确保数据能够正确传输。如果参数不一致,可能会导致数据丢失或接收错误。

4.核心类

头文件

#ifndef SERIALPORTWRAP_H
#define SERIALPORTWRAP_H
#pragma execution_character_set("utf-8")
#include <QObject>
#include <QSerialPort>

class SerialPortWrap : public QObject
{
    Q_OBJECT
public:
    static QMap<QString,QSerialPort::Parity> getParityMap();

    static QMap<QString,QSerialPort::DataBits> getDataMap();

    static QMap<QString,QSerialPort::StopBits> getStopMap();

    static QMap<QString, QSerialPort::FlowControl> getFlowMap();

public:
    explicit SerialPortWrap(QObject *parent = nullptr);

    void setSerialPort(QSerialPort *port);

    bool sendNoReply(QByteArray data);

    bool sendReply(QByteArray data, QByteArray &rec);

signals:
    void receivedData(QByteArray data);

public slots:

private:
    QSerialPort *_serial=nullptr;
    QList<QByteArray> _recList;

    void waitMs(int ms);

private slots:
    void one rror(QSerialPort::SerialPortError err);
    void onReadyReady();
};

#endif // SERIALPORTWRAP_H

cpp

#include <QMap>
#include <QDebug>
#include <QEventLoop>
#include <QElapsedTimer>
#include <QTimer>
#include "serialportwrap.h"

QMap<QString, QSerialPort::Parity> SerialPortWrap::getParityMap()
{
    QMap<QString,QSerialPort::Parity> parityMap={
        {"NoPraity",QSerialPort::NoParity},
        {"EvenParity",QSerialPort::EvenParity},
        {"OddParity",QSerialPort::OddParity},
        {"SpaceParity",QSerialPort::SpaceParity},
        {"MarkParity",QSerialPort::MarkParity}
    };
    return parityMap;
}

QMap<QString, QSerialPort::DataBits> SerialPortWrap::getDataMap()
{
    QMap<QString,QSerialPort::DataBits> dataMap={
        {"Data5",QSerialPort::Data5},
        {"Data6",QSerialPort::Data6},
        {"Data7",QSerialPort::Data7},
        {"Data8",QSerialPort::Data8}
    };
    return dataMap;
}

QMap<QString, QSerialPort::StopBits> SerialPortWrap::getStopMap()
{
    QMap<QString,QSerialPort::StopBits> stopMap={
        {"OneStop",QSerialPort::OneStop},
        {"OneAndHalfStop",QSerialPort::OneAndHalfStop},
        {"TwoStop",QSerialPort::TwoStop}
    };
    return stopMap;
}

QMap<QString, QSerialPort::FlowControl> SerialPortWrap::getFlowMap()
{
    QMap<QString,QSerialPort::FlowControl> flowMap={
        {"NoFlowControl",QSerialPort::NoFlowControl},
        {"HardwareControl",QSerialPort::HardwareControl},
        {"SoftwareControl",QSerialPort::SoftwareControl},
        {"UnknownFlowControl",QSerialPort::UnknownFlowControl}
    };
    return flowMap;
}

SerialPortWrap::SerialPortWrap(QObject *parent) : QObject(parent)
{

}

void SerialPortWrap::setSerialPort(QSerialPort *port)
{
    _serial=port;
    connect(_serial,&QSerialPort::errorOccurred,this,&SerialPortWrap::onError);
    connect(_serial,&QSerialPort::readyRead,this,&SerialPortWrap::onReadyReady);
}

bool SerialPortWrap::sendNoReply(QByteArray data)
{
    _recList.clear();
    return  _serial->write(data)!=-1;
}

bool SerialPortWrap::sendReply(QByteArray data,QByteArray &rec)
{
    _recList.clear();
    _serial->write(data);

    QElapsedTimer ela;
    ela.start();
    while(_recList.count()==0)
    {
        waitMs(100);
        if(ela.elapsed()>3000)
        {
            throw QString("%1 time out").arg(_serial->portName());
        }
    }
    waitMs(50);
    QByteArray arr;
    for(int i=0;i<_recList.count();i++)
    {
        arr.append(_recList.at(i));
    }
    rec=arr;
    return true;
}

void SerialPortWrap::waitMs(int ms)
{
    QEventLoop loop;
    QTimer::singleShot(ms, &loop, &QEventLoop::quit);  // 设置定时器,在超时时退出事件循环
    loop.exec();  // 进入事件循环
}

void SerialPortWrap::onError(QSerialPort::SerialPortError err)
{
    qDebug()<<__FUNCTION__<<__LINE__<<_serial->portName()<<_serial->errorString();
}

void SerialPortWrap::onReadyReady()
{
    QByteArray arr=_serial->readAll();
    _recList.append(arr);
    emit receivedData(arr);
}


5.效果图:

在这里插入图片描述

标签:常见问题,QByteArray,QMap,QSerialPort,SerialPortWrap,串口,include,Qt
From: https://www.cnblogs.com/ahsczj/p/18426257

相关文章

  • QTableWidget用法总结
    QTableWidget用法总结直接上代码mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QDateTime>#include<QScrollBar>#include<QFile>#include<QIODevice>QT_BEGIN_NAMESPACEnamespaceUi{class......
  • Python 客户端类库之paho-mqtt学习总结
    实践环境Python3.9.13paho-mqtt2.1.0简介EclipsePahoMQTTPython客户端类库实现了MQTT协议版本5.0,3.1.1,和3.1。该类库提供一个客户端类,允许应用连接到MQTT代理并发布消息,订阅主题并检索发布的消息。同时还提供了一个写其它辅助函数,使向MQTT服务器发布一次性消息变......
  • 使用Postman测试MQTT协议接口
    MQTT概述MQTT(MessageTelemetryTransport)是一种用于物联网(IoT)的消息传递协议。它的使用范围从家庭自动化和可穿戴设备的小型设备到大型工业机械的自动化。它是一种轻量级技术,以发布/订阅模式为模型,其中连接到单个代理的客户端可以将消息发布到不同的主题,并订阅主题以接收来自......
  • 解决帝国CMS安装出错和常见问题
    解决帝国CMS安装出错和常见问题通常涉及多个方面的排查和处理。以下是一些常见的问题及其解决方法:1.安装界面不能正常显示检查PHP版本:确保你的服务器安装了帝国CMS所需的PHP版本。检查PHP扩展:确保服务器启用了GD库、cURL等必要的PHP扩展。检查浏览器兼容性:尝试更换浏览器或......
  • 如何使用 Bittly 进行基于串口的自动化测试
    串口通信是一种常见的通信方式,广泛用于嵌入式设备、传感器及其他硬件设备的数据交互与控制。通过串口通信,我们能够实时监控设备状态、发送指令并接收反馈。在自动化测试场景中,Bittly提供了一套灵活高效的工具,能够快速创建和管理自动化测试任务,简化复杂的测试流程。同时,Bitt......
  • 电脑串口和手机蓝牙BLE串口数据包通信调试工具
    1,支持HEX收发2,支持文本收发3,支持自定义按钮发送自定义命令和数据包4,支持自定义解析包内任意位置1~4字节转int并显示5,自定义json举例说明[{"name":"1234命令","type":"button","cmd":"1234","data":"01020304"},{"name":"1......
  • QT核心模块源码分析:定时器与并发
    QT核心模块源码分析:定时器与并发使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化......
  • QT 3D动画与效果实现
    QT3D动画与效果实现使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频免费看......
  • QT 3D渲染技术详解
    QT3D渲染技术详解使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频免费看免......
  • QT Widgets模块源码解析与实践
    QTWidgets模块源码解析与实践使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视......