QT 串口通信详解

2023-11-07

1、前言

在进行串口通信时,驱动器或者单片机往往只能发送或接收16进制数据,而对于用户而言,16进制数据显然晦涩难懂,需要将其转换为通俗易懂的10进制或者可读字符串。QT中因为有相关的函数进行转换,特此总结,以加深印象。

说明:
系统:Windows10 X86
QT版本:6.1.2
驱动板通讯协议:Modbus协议
使用库:<QtSerialPort/QSerialPort>、<QtSerialPort/QSerialPortInfo>

2、串口参数配置

在这里插入图片描述

port_num = cui->cbx_port_num->currentText();    // 串口号
Baud=cui->cbx_ubaud->currentText();				// 波特率
Data_bits=cui->cbx_databits->currentText();		// 数据位
DCB = cui->cbx_stopbits->currentIndex();		// 停止位和校验位的index

// 设置参口参数
QSerialPort global_port;  			// 使用串口类声明串口对象
global_port.setPortName(port_num);	// 设置串口号
global_port.setBaudRate(Baud.toInt(), QSerialPort::AllDirections); // 设置波特率
global_port.setFlowControl(QSerialPort::NoFlowControl);
switch (Databits.toInt()) { //设置数据位
    case 5:
        global_port.setDataBits(QSerialPort::Data5);
        break;
    case 6:
        global_port.setDataBits(QSerialPort::Data6);
        break;
    case 7:
        global_port.setDataBits(QSerialPort::Data7);
        break;
    case 8:
        global_port.setDataBits(QSerialPort::Data8);
        break;
    default:
        global_port.setDataBits(QSerialPort::Data8);
        break;
    }
// {{'n', '2'}, {'o', '1'}, {'e', '1'}, {'n', '1'}};
switch (DCB) { // 设置停止位 和 检验位
    case 0:
        global_port.setParity(QSerialPort::NoParity);
        global_port.setStopBits(QSerialPort::TwoStop);
        break;
    case 1:
        global_port.setParity(QSerialPort::OddParity);
        global_port.setStopBits(QSerialPort::OneStop);
        break;
    case 2:
        global_port.setParity(QSerialPort::EvenParity);
        global_port.setStopBits(QSerialPort::OneStop);
        break;
    case 3:
        global_port.setParity(QSerialPort::NoParity);
        global_port.setStopBits(QSerialPort::OneStop);
        break;
    default:
        global_port.setParity(QSerialPort::EvenParity);
        global_port.setStopBits(QSerialPort::OneStop);
        break;
    }
global_port.open(QSerialPort::ReadWrite) // 以读写的方式打开串口
// global_port.isopen() 判断端口是否打开
// global_port.close()  关闭串口

3、驱动板接收数据

// 设置好串口参数后,才能进行此操作
// 从ui界面获取数据
QString data =ui->qlineedit->text();
// 判断数据中是否有空格,有空格去掉
if (data.contains(" "))
   data.replace(QString(" "), QString(""));
// 数据转换
QByteArray buf = QByteArray::fromHex(data.toLatin1());
// 添加crc16位校验码
BYTE *data_crc;
data_crc = reinterpret_cast<unsigned char*>(buf.data()); //将qbytearray数据转成byte类型数据
res = CalcCrc16(data_crc, buf.size());
// 写入数据
global_port.write(buf, buf.size());
global_port.flush();

4、接收数据

QString data;
// 如果缓冲区有数据,继续读取,没有数据时执行下部操作
while (global_port.waitForReadyRead(100))
    buffer.append(global_port.readAll().toHex().toUpper());
    
// 处理数据   错误返回数据和正常返回数据都>=5
if (buffer.size()>=5){
    cui->textBrowser->clear();
    data = buffer;
    for (int i=0;i<data.size();i+=2+1)
        data.insert(i, QLatin1String(" "));
    data.remove(0,1);
    // qDebug() <<"处理后的数据:"<<data;
    cui->textBrowser->append(data);
    }
buffer.clear() // 清除缓冲区

最后串口测试效果图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 串口通信详解 的相关文章

随机推荐

  • 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目链接 53 I 在排序数组中查找数字 I 思路分析 利用二分查找即可 class Solution public int search vector
  • QT5.15.2在线安装教程(详细图文)

    一 在线安装的原因 QT对5 15以及以上版本已经停止提供离线安装包 但是 5 15以及以上版本都支持在线安装 Qt5 15以下版本可直接在Index of archive qt中下载离线安装包 二 QT账号的注册 1 打开百度 搜索QT
  • 小学科技创新项目的查新报告

    我们也经常看到这些 别人家的孩子 11岁杨荷馨 南京市六合区玉带镇中心小学伸缩式车厢卡车第六届国际发明博览会的银牌 已经申请国家专利 11岁小学生发明节能燃气灶 11岁女 发明家 造智能温控电风扇获金奖 那么现在当你家小朋友也要参加小学科技
  • 四个收敛的关系:一致收敛,点态收敛,绝对收敛,条件收敛

    一致收敛和点态收敛 先看两者定义 一致收敛 任意正数 epsilon 存在 N gt 0 N gt 0 N gt 0 当
  • VUE-CLI测试环境和打包正式环境的配置切换

    config文件夹pro d env js文件 use strict module exports NODE ENV production API ROOT http 120 79 94 143 配置开发端口 config文件夹dev en
  • 化繁为简,使用Hibernate Validator实现参数校验(一)

    目录 前言 环境配置 导入依赖 基础校验 校验注解 参数绑定 PathVariable RequestParam RequestBody Validated Valid 单参校验 对象校验 分组校验 顺序校验 前言 在之前的悦享校园的开发中
  • docker 离线安装

    目录 服务介绍 软件下载 服务配置 二进制安装docker与docker compose 服务管理命令 服务介绍 docker 是一个供开发和运维人员开发 测试 部署和运行应用的容器平台 docker compose 是一个用于运行和管理多
  • 缓存案例-架构真题(二十二)

    试题一 某大型电商平台建立一个B2B商店系统 并在全国建设了仓储中心 但是在运营过程中 发现很多跨仓储中心调货 延误运送 为此建立全国仓储系统 通过对订单的分析和挖掘 并通过大数据分析预测各类配置 降低成本 当用户通过B2B商店下单 会通过
  • Notepad++ - 缓存目录

    C Users 你的用户名 AppData Roaming Notepad backup 被360清理了 或者程序崩溃了 死机了 都可以在这里找到
  • 华为OD机试经验(A 卷 2022Q4)

    文章目录 1 汇率 2 箱子之字形摆放 3 Excel单元格数值统计 先打个小广告 在我的Hr的指导帮助下 顺利通过了机试 两轮技术面 由于今年顺利研究生上岸 所以没有进行主管面试了 向各位想去华为OD的小伙伴们推荐我的对接Hr微信 蒋虎
  • 【亲测有用】腾讯会议共享PPT,并开启演讲者模式

    出发点 腾讯会议共享PPT 开启演讲者模型 并且观看屏幕的人根本看不到你的演讲者模型 我这边Win10亲测有用 我单笔记本屏幕测试 原理解释 通过播放PPT 产生了一个全屏 可以把它理解为是扩展屏 然后切回演讲者模式的那个屏幕 可以理解为电
  • Redis7--基础篇1(概述,安装、卸载及配置)

    1 Redis概述 1 1 什么是Redis Redis REmote Dictionary Server 远程字典服务器 Remote Dictionary Server 远程字典服务 是完全开源的 使用ANSIC语言编写遵守BSD协议
  • Elasticsearch实战(十三)---聚合搜索Aggs聚合及Count,Avg操作

    Elasticsearch实战 聚合搜索Aggs聚合及Count Avg操作 文章目录 Elasticsearch实战 聚合搜索Aggs聚合及Count Avg操作 1 聚合搜索 bucket 桶及metric分析计算 1 1 准备数据 2
  • vue3+element plus input输入框限制输入数字和小数点

    不能以小数点开头 且只能有一个小数点
  • 如何入门学习python爬虫技术?

    作为一门历史悠久的语言 Python比R更具有通用性 比C 更灵活 可以说Python是一个很全面的语言 尤其是在数据科学 机器学习和AI方面 表现很出色 如果想自学 怎么学习python爬虫技术 一 基础知识的掌握 什么是爬虫 数据是从哪
  • Linux查看内存,线程 ,CPU等情况

    有的时候需要看服务器的状态 比如内存使用状态 线程 CPU使用情况等 要掌握一些linux的命令是很必要的 所以我们大致总结一下这些命令 1 内存使用情况 方法一 top命令 top命令会显示内存 CPU还有swap硬盘等状况 我们可以通过
  • 小知识·CMake使用

    目录 1 cmake 变量引用的方式 2 cmake 自定义变量的方式 3 cmake 常用变量 4 cmake 调用环境变量的方式 5 系统信息 6 主要的开关选项 7 小结 1 cmake 变量引用的方式 使用 进行变量的引用 在 IF
  • Mac修改hosts文件

    hosts可使任意字符串变成一个对应的ip hosts文件位于 private etc hosts 可以通过下面两种方法进行修改 第1种方法 1 终端命令 sudo vi etc hosts 回车后输入密码 再回车就可以打开我们的hosts
  • RTMP开发记录 测试服务器搭建篇

    感谢作者 http www cnblogs com valu p 6287562 html nginx rtmp module 安装 最近在做直播功能 为了方便调试 在本地搭建一个rtmp server吧 我的配置环境是Ubuntu12 0
  • QT 串口通信详解

    1 前言 在进行串口通信时 驱动器或者单片机往往只能发送或接收16进制数据 而对于用户而言 16进制数据显然晦涩难懂 需要将其转换为通俗易懂的10进制或者可读字符串 QT中因为有相关的函数进行转换 特此总结 以加深印象 说明 系统 Wind