当前位置: 首页 > news >正文

基于Qt的串口调试工具

1.项目地址

https://github.com/zhangjiechina001/SerialPortTool

2.核心类

头文件

#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);
}

3.效果图:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 静态和动态类型语言
  • Django笔记一:搭建Django环境与URL路径访问
  • mysql组合键唯一
  • Unreal游戏初始化流程
  • 将 Parallels Desktop(PD虚拟机)安装在移动硬盘上,有影响吗?
  • Fortran:program 和 subroutine 的区别
  • 综合型医院适合什么样的数据摆渡方式,才能服务与安全兼顾?
  • 如何通过深度学习实践来理解深度学习的核心概念
  • STM32 之 SDRAM 详解
  • 【编程基础知识】数据库表设计三范式
  • Open3D(C++) 点云中的植被信息提取
  • 【四范式】浅谈NLP发展的四个范式
  • Java 21的Logging的笔记
  • 79.Options Object 模式
  • Knife4j:打造优雅的SpringBoot API文档
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • CSS盒模型深入
  • ES学习笔记(12)--Symbol
  • flask接收请求并推入栈
  • Java 最常见的 200+ 面试题:面试必备
  • Java多态
  • java中具有继承关系的类及其对象初始化顺序
  • magento 货币换算
  • Node项目之评分系统(二)- 数据库设计
  • PHP的类修饰符与访问修饰符
  • python_bomb----数据类型总结
  • Redash本地开发环境搭建
  • Sass 快速入门教程
  • vue.js框架原理浅析
  • 看域名解析域名安全对SEO的影响
  • 如何实现 font-size 的响应式
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 首页查询功能的一次实现过程
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​浅谈 Linux 中的 core dump 分析方法
  • ​数据结构之初始二叉树(3)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{} 和 ${}区别
  • #window11设置系统变量#
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #在 README.md 中生成项目目录结构
  • (02)vite环境变量配置
  • (26)4.7 字符函数和字符串函数
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)一些感悟
  • *** 2003
  • .NET Core 发展历程和版本迭代
  • .NET DataGridView数据绑定说明