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

news2024/9/22 23:16:22

1.项目地址

https://github.com/zhangjiechina001/SerialPortTool

2.使用注意

  1. 串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确,设置错了有时会连接上但是传输的数据会很奇怪,有时直接连接不上了

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 onError(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.效果图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

7 款 Mac 剪贴板管理器帮助你改善工作流

大家都知道&#xff0c;Mac自带的剪贴板功能实在是太简陋了。复制一下、粘贴一下&#xff0c;就这么点能耐&#xff0c;简直就是个临时小仓库。 如果你经常需要复制粘贴各种内容&#xff0c;Mac原生的剪贴板可能反而会拖你的后腿。这时候&#xff0c;是时候升级一下你的剪贴板…

自有平台自有品牌如何利用电商API接口做定价参考(多平台商品详情数据接口)

如今&#xff0c;多数自有商城自有品牌在为产品做定价时都会参考淘宝|天猫|京东等主流电商平台的商品价格以做参考&#xff0c;这一行为的好处主要有以下几点&#xff1a; 通过参考主流平台价格&#xff0c;用户更能了解目标市场中消费者对产品的接受度&#xff0c;从而制定出符…

C++速通LeetCode简单第17题-爬楼梯(全网最简单)

思路要点&#xff1a;将问题转化为求斐波那契数列的第n项&#xff0c;然后迭代。 思路分析&#xff1a;最后一次爬的阶数不是1就是2&#xff0c;假设爬n阶的方法数是f(n)&#xff0c;假设最后一次爬1阶&#xff0c;那么爬前面的 n-1阶的方法数是f(n-1)&#xff1b;假设最后一次…

DepthCrafter:为开放世界视频生成一致的长深度序列

通过利用视频扩散模型&#xff0c;我们创新了一种新颖的视频深度估算方法–DepthCrafter。 它可以为开放世界视频生成具有细粒度细节的时间一致性长深度序列&#xff0c;而无需摄像机姿势或光流等附加信息。 简介 动机。 尽管在静态图像的单目深度估算方面取得了重大进展&…

Vue2集成高德地图遇到的几个问题

文章目录 前言集成地图实现的功能遇到的问题Uncaught Error: Invalid Object: LngLat(NaN, NaN)搜索结果不显示地图异步加载问题 写在最后 前言 几年没碰过前端了&#xff0c;最近闲来无事在捣鼓一个小项目&#xff0c;项目中一个功能涉及到地图组件&#xff0c;没想到在集成高…

敏捷项目管理:团队高效协作的关键

在当今快节奏的市场环境中&#xff0c;企业必须具备快速响应变化的能力。无论是产品研发、软件开发还是市场推广&#xff0c;灵活应对变化和高效管理项目已成为企业成功的关键。于是&#xff0c;敏捷开发这一理念越来越多地被各行业团队采纳&#xff0c;成为了他们高效协作、及…

git学习【持续更新中。。。】

git学习【持续更新中。。。】 文章目录 git学习【持续更新中。。。】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件9.理解分支10.创建、切换、合并分支11.删除分支12.合并…

B站开源长文本大模型:我很小但很能“装”

一、“2% GPT size, yet powerful.” 模型简介 Index-1.9B-32K 是一个拥有 1.9B &#xff08;19亿&#xff09;参数并具备 32K 上下文长度的语言模型&#xff08;这意味着&#xff0c;这个超小精灵可以一次性读完 3.5 万字以上的文档&#xff09;。 在多项长文本评测任务中&am…

单链表的实现(C语言)

目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构&#xff0c;物理结构不连续&#xff0c;逻辑结构是连续的&#xff0c;在计算机中链表的实际存储是按照一个结点内存放…

基于springboot+vue实现的智能垃圾分类系统 (源码+L文+ppt)4-063

摘 要 本论文主要完成不同用户的权限划分&#xff0c;不同用户具有不同权限的操作功能&#xff0c;系统包括用户、物业和管理员模块&#xff0c;主要功能有用户、物业、垃圾站点、垃圾投放、验收信息、积分商城、积分充值、通知物业等管理操作。 关键词&#xff1a;智能垃圾…

微信支付开发-前端api实现

一、操作流程图 二、代码实现 <?php /*** 数字人答题业务流* User: 龙哥三年风水* Date: 2024/9/11* Time: 14:59*/ namespace app\controller\shuziren; use app\controller\Base; use app\model\param\QuestionParam as PQPModel; use app\model\answer\QuestionBank; u…

codemirror 代码在线编辑器基本使用

CodeMirror 是一个强大的基于浏览器的文本编辑器组件&#xff0c;主要用于网页中创建可编辑的源代码区域&#xff0c;特别适用于编写和展示程序代码。它支持多种编程语言的语法高亮、代码折叠、自动补全、查找替换等多种高级编辑特性。 npm install vue-codemirror --save 或者…

RabbitMQ Spring客户端使用

注解声明式队列和交换机 java自带序列化工具类&#xff0c;将java对象序列化为字节数组&#xff0c;用于网络传输。 jdk序列号存在缺陷&#xff0c;&#xff08;不安全&#xff0c;占用空间大等&#xff09; 推荐使用JSON的序列化&#xff1a; springboot扫描包使配置生效&…

WordPress建站钩子函数及使用

目录 前言&#xff1a; 使用场景&#xff1a; 一、常用的wordpress钩子&#xff08;动作钩子、过滤器钩子&#xff09; 1、动作钩子&#xff08;Action Hooks&#xff09; 2、过滤器钩子&#xff08;Filter Hooks&#xff09; 二、常用钩子示例 1、添加自定义 CSS 和 JS…

谈谈OpenAI o1的价值意义及RL 的Scaling Law

蹭下热度谈谈OpenAI o1的价值意义及RL 的Scaling law。 一.OpenAI o1是大模型的巨大进步 1.1 我觉得OpenAI o1是自GPT 4发布以来&#xff0c;基座大模型最大的进展&#xff0c;逻辑推理能力提升的效果和方法比我想的要好&#xff0c;GPT 4o和o1是发展大模型不同的方向&#x…

计算机毕业设计 乡村生活垃圾管理系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

视觉Transformer(ViT) :全面超越CNN,看懂这篇文章就没什么能难倒你了!

【视觉Transformer】(Vision Transformer, ViT) 是一种革命性的技术&#xff0c;它将Transformer架构应用于视觉识别任务&#xff0c;通过自注意力机制来捕捉图像中的特征关系&#xff0c;显著增强了模型对视觉信息的解析力。这一领域的研究不仅打破了传统卷积神经网络&#xf…

【BFS专题】— 解决拓扑排序问题

拓扑排序介绍&#xff1a; 1、课程表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 通过Map<Integer, List<Integer>> 来创建邻接图&#xff0c;数组来表示入度然后遍历课程数组&#xff0c;建图然后再拓扑排序&#xff0c;bfs最后在遍历入度数组&…

ADB ROOT开启流程

开启adb root 选项后&#xff0c;执行如下代码&#xff1a; packages/apps/Settings/src/com/android/settings/development/AdbRootPreferenceController.java mADBRootService new ADBRootService(); Override public boolean onPreferenceChange(Preference preference…