串口助手(串口发送接收数据, 定时, 清空, hex显示)

news2024/12/24 20:49:29

文章目录

  • 前言
  • 一、串口接收数据
      • 1. 默认接收,换行,hex显示
      • 2. 清空接收区数据
      • 3. 保存接受区数据
  • 二、串口发送数据
      • 1. 默认发送
      • 2. 定时发送
  • 三、串口助手优化
      • 1. 设置组合框当前内容。
      • 2. 未检测到串口,弹出警告。
      • 3. 载入文件
  • 总结

前言

这篇文章继续介绍 自制串口助手。串口助手(上)


一、串口接收数据

1. 默认接收,换行,hex显示

串口接收数据时,可以选择 “接收时间”, " HEX显示", “自动换行”。
在这里插入图片描述
在 Qt 中,通过 QSerialPortread( ) 函数可以实现串口的读取数据。

QSerialPort 会在串口有数据收到时发出 readyRead( ) 信号,可以在其槽函数里进行数据的接收。

// 连接信号与槽
connect(serial, SIGNAL(readyRead()), this, SLOT(receiveData()));
void Widget::receiveData()
{
    QByteArray data = serial->readAll();			 // readAll() 读取串口缓冲区的所有数据

    bytesReceive += QString(data).size();			// size() 获取接收数据的字节大小
    qDebug() << bytesReceive;

    // 检查读取是否成功
    if (data.isEmpty())
    {
        qDebug() << "Failed to read the data from serial port";
        return;
    }

    // 处理数据
    if(ui->checkBox_7->isChecked())    						// toHex() 转换为 hex
    {
        QString hexString = data.toHex(' ');
		ui->plainTextEdit->insertPlainText(hexString);
    }
    else if(ui->checkBox_10->isChecked())    				 // appendPlainText()换行
    {
        ui->plainTextEdit->appendPlainText(QString(data));
    }
    else if(ui->checkBox->isChecked())        				 // 接收时间
    {
    	// currentDateTime ()获取当前时间
        QDateTime currentTime = QDateTime::currentDateTime(); 
             
        // 显示接收时间 
        QString strDateTime = currentTime.toString(QString("【") + "yyyy-MM-dd hh:mm:ss" + QString("】  "));

        ui->plainTextEdit->insertPlainText(strDateTime);
        ui->plainTextEdit->insertPlainText(QString(data));
    }
    else
    {
        ui->plainTextEdit->insertPlainText(QString(data));		// 默认数据接收,
    }

    ui->label_13->setText("Received: " + QString::number(bytesReceive));
}

注意
appendPlainText(const QString &text ) : 将带有文本的新段落附加到文本编辑的末尾。

insertPlainText ( const QString &text) : 在当前光标位置插入文本的便利插槽。

setPlainText(const QString &text): 将文本编辑的文本更改为字符串文本。将删除任何以前的文本

2. 清空接收区数据

使用 clear( ) 函数可以清空接受区的数据。


ui->plainTextEdit->clear();

3. 保存接受区数据

  1. 使用 文件对话框类QFileDialog 中的静态函数 getSaveFileName 函数 ,返回用户选择要保存的文件路径 ( filename )。

在这里插入图片描述
在这里插入图片描述

  1. 创建一个 QFile 对象 ( file ),以写入模式( QIODevice::WriteOnly ) 打开文件。

  2. 使用 QTextStream 创建一个数据流 ( out ),将文件与数据流关联。

  3. 使用了 QPlainTextEdittoPlainText( ) 函数来获取 接受区 中的所有纯文本数据。
    使用数据流将 接受区中的文本写入到文件中。

详细代码:

/*得到要保存的的文件名*/
QString filename = QFileDialog::getSaveFileName(this, "另存为", "C:/", tr("Text Files(*.txt)"));

/*判断文件名是否为空,文件是否保存成功*/
if(!filename.isEmpty())
{
    QFile file(filename);
    if(file.open(QIODevice::WriteOnly))
    {
        QTextStream out(&file);       				 //数据流 写数据进文件
        out << ui->plainTextEdit->toPlainText();

        file.close();						// 关闭文件
    }
}

效果展示:
在这里插入图片描述

二、串口发送数据

1. 默认发送

使用 QSerialPort 类的 write( ) 函数进行发送。
write( ) 返回值 是 实际写入的字节数.

write(const char *data);
void Widget::sendData()
{
    QString data = ui->lineEdit_9->text();				// 获取要发送的文本

    // 由于data 是QString ,需要转换为 const char *
    QByteArray byteArray = data.toUtf8();     			// 1.将QString -> QByteArray
    const char *data1 = byteArray.data();     			// 2.获取 QByteArray 的数据指针

    int Send = serial->write(data1);					// 3.发送数据,返回写发送的字节数

    bytesSend += Send;									// 累计发送数据的个数
    ui->label_14->setText("Send: " + QString::number(bytesSend));
}

按下 “ 发送” 按钮,发送数据:

void Widget::on_send_clicked()
{
    sendData();
}

2. 定时发送

通过自己设置的时间间隔来定时发送数据。
在这里插入图片描述

定时发送 需要依靠于定时器类 QTimer

// 创建定时器对象
 QTimer timer2;

 timer2.setInterval(ui->ms_time->text().toInt());		// toInt将字符串转换为int类型。获取,设置时间间隔。
 timer2.start();									  // 启动定时器
   
// 连接信号与槽,到达时间间隔则进入 timerSend 槽函数
connect(&timer2,SIGNAL(timeout()),this,SLOT(timerSend()));		
void Widget::timerSend()          // 定时发送数据
{
    if(ui->checkBox_11->isChecked())
    {
        timer2.setInterval(ui->ms_time->text().toInt());    //更新右下角时间
        sendData();
    }
}

效果如下图:
在这里插入图片描述

三、串口助手优化

1. 设置组合框当前内容。

当 组合框 中有多个选项卡时,可以使用 setCurrentIndex( ) 函数来选择当前显示的选项卡。
参数 index 要显示的选项卡的索引值,选项卡的索引值从 0 开始计数

void setCurrentIndex(int index);

2. 未检测到串口,弹出警告。

使用 QMessageBox 类的 静态成员函数 warning 来弹出消息对话框。

在这里插入图片描述

QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)

其中:

  • parent:指定该对话框所属的父组件,通常传入 this 即可,代表当前组件。
  • title:警告对话框的标题。
  • text:警告对话框的内容(警告信息)。
  • buttons:指定对话框上出现的按钮。默认情况下只会显示 OK 按钮。可以选择其他的按钮,如 Yes、No、Cancel、Apply、Close 等。
  • defaultButton:指定哪个按钮应该被默认选中。默认情况下不会有默认选中的按钮。

3. 载入文件

如果我们使用多文本发送数据,可以点击 " 载入",即可将保存好的文本在文本框中显示,直接发送即可。
在这里插入图片描述

// 1.打开文件对话框选择要打开的文件,并返回其路径
QString fileName = QFileDialog::getOpenFileName(this, "打开列表", "C:/Users/w/Desktop/test1", tr("Text Files(*.txt)"));

// 2. 根据路径创建 QFile 对象
QFile file(fileName);

QString one = "";
QString two = "";

// 3. 以可读可写的模式打开文件
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
	// 4.创建一个数据流 in,将文件与数据流关联
    QTextStream in(&file);

	// 5. 数据流读出数据
    in >> one;
    in >> two;
	
	// 6. 将文本显示在文本框中
    ui->lineEdit->setText(one);
    ui->lineEdit_2->setText(two);
	
	// 关闭文件
    file.close();
}

总结

大家可以在此基础上 对自制的 串口助手 加以改进和开发。

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

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

相关文章

ESP32-S3 使用指定 key 来进行 secure boot 签名并进行 OTA 测试

文档说明 Secure Boot V2 测试准备&#xff1a; 硬件准备&#xff1a;ESP32-S3 开发板或模组软件准备&#xff1a;esp-idf v5.0 版本 SDK 测试步骤&#xff1a; 生成指定 secure boot 签名 key软件开启 secure boot 配置烧录被签名的固件对新的 app.bin 使用指定 key 进行…

【006 Linux内核】应用程序中open()在linux中执行过程中是如何从用户空间到内核空间?

一、前言 应用程序运行在用户空间&#xff0c;而 Linux 驱动运行于内核空间。当我们在用户空间想要实现对内核的操作&#xff0c;比如使用 open 函数打开/dev/led 这个驱动&#xff0c;由于用户空间不能直接对内核进行操作&#xff0c;因此必须使用一个叫做 “系统调用” 的方…

论文阅读 (90):Proposal-based Multiple Instance Learning (P-MIL, 2023CVPR)

文章目录 1 要点1.1 概述1.2 一些概念1.3 主要步骤 2 方法2.1 候选提案生成2.2 提案特征提取和分类2.2.1 周围对比特征提取2.2.2 分类头 2.3 提案微调2.3.1 提案完备性评估2.3.2 实例级秩一致性 2.4 网络训练和推理2.4.1 网络训练2.4.2推理 3 实验3.1 数据集即评估标准3.1.1 数…

一线大厂Java 面试题大全1100+ 面试题附答案详解(2023最新整理)

写在前面 今年的面试比往年要难得多&#xff0c;各个互联网企业对于 Java 岗位的要求越来越多&#xff0c;也越来越高&#xff0c;主要是初级岗位已经趋近饱和&#xff0c;但高级岗位又相对来说缺乏&#xff0c;这类的人才偏少&#xff0c;因此作为 Java 开发人员&#xff0c;…

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第四篇文章&#xff01; 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已经在4月16日圆满结束&#xff0c;早想腾出时间来好好整理活动期间分享的知识点。 &#x1f3c6;&#x1…

【TiDB Future App Hackathon 2023 】TiDB 首届全球黑客马拉松,开发者的狂欢夏日盛会!快来一起 Coding 吧!...

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/cf364859 2023 TiDB Future App Hackathon 来啦&#xff01;本届 Hackathon 的主题为&#xff1a;Code, Innovate & Build Amazing Data Applications —— 释放你的创造力、构建突破性的应用…

JS逆向之大众点评mtgsig

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动、恶意滥用技术等&#xff0c;否则后果自负。观看则同意此约定。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 前言 一、先分析下接口参数 二、开导…

不懂这个118358-80-8甘露糖丝氨酸?看看Fmoc-Ser(Ac4Manα)-OH的全面解析吧!

Fmoc-Ser(Ac4Manα)-OH&#xff0c;甘露糖丝氨酸Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;118358-80-8 2.Molecular formula&#xff1a;C32H35NO14 3.Molecular weight&#xff1a;657.63 4.Packaging specification&#xff1…

浅谈响应式网页设计 —— 测试该知道的二三事

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

【LeetCode】每日一题 -- 1240. 铺瓷砖 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/tiling-a-rectangle-with-the-fewest-squares/ 1. 题解&#xff08;1240. 铺瓷砖&#xff09; 23.05.31 华为机试第二题 1.1 暴力深搜 – DFS NP-Complete 问题 题解参考&#xff1a;Java DFS暴力递归&#xff08;详细注释&…

LeetCode 2352. Equal Row and Column Pairs【模拟,哈希表,前缀树】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

100G QSFP28光模块类型和使用场景

100G QSFP28光模块是当前数据中心和通信网络中广泛应用的高速光模块之一。本文将详细介绍100G QSFP28光模块的类型、应用场景以及市场发展前景&#xff0c;并引用相关产品参数和行业统计数据&#xff0c;为读者提供全面的了解。 一、100G QSFP28光模块类型 100G QSFP28光模块…

开源 API 网关的访问策略(一)

许多企业和组织面临着网关访问控制的挑战&#xff0c;因为传统的访问控制方法往往过于笨重和繁琐。这些方法可能涉及复杂的规则集、繁琐的手动配置过程、缺乏灵活性和可扩展性等问题。此外&#xff0c;随着云计算和移动设备的广泛应用&#xff0c;访问控制的复杂性和挑战程度也…

stable-diffusion-webui 安装采坑日记

这里写自定义目录标题 安装容易采坑的点效果测试 安装容易采坑的点 1、不愿安装大佬的整合包。在自己时间足够多的情况下&#xff0c;可以尝试自己搭环境。但是自己安装的时间成本真的非常高&#xff0c;环境配置报错会让人陷入崩溃&#xff0c;如果没有代码排错能力&#xff…

sw2urdf导出的urdf文件中的惯性参数(inertial)错误的问题

现象描述 有时候&#xff0c;当我们使用solidworks建好我们的模型&#xff0c;然后利用【sw2urdf】导出后&#xff0c;发现其中的惯性参数&#xff0c;似乎不正确&#xff0c;ixx、izz这些参数都是很接近0的&#xff1a; 资料查找 其实这个不是我们设置的问题&#xff0c;而…

蓝牙耳机什么牌子好?无线蓝牙耳机品牌推荐

相信很多人都有过这样的经历&#xff0c;早晚高峰像沙丁鱼般被挤在公交或地铁上&#xff0c;嘈杂的环境、工作的劳累让你只想听听音乐追追剧&#xff0c;给自己一些放松的时光。可拿出有线耳机却常常被挤掉&#xff0c;更有被扯到耳朵的时候。想换一款蓝牙耳机&#xff0c;但面…

做连接中国企业出海的全球技术桥梁,亚马逊云科技出海日盛夏盛启

出海路漫漫&#xff0c;企业开拓全球市场而孤军奋战&#xff0c;常常会感到力不从心。好的产品有了&#xff0c;渠道有了&#xff0c;供应链有了&#xff0c;还要自己从0-1搭建存储、网络和架构&#xff1f;营销季来了想趁机冲一波销量&#xff0c;还要自己运维本地IDC、大促来…

docker-compose 部署zookeeper集群 —— 筑梦之路

1. zookeeper介绍 Zookeeper是一个开源的分布式协调服务中间件&#xff0c;它提供了一种分布式数据管理服务&#xff0c;能够实现分布式锁、命名服务、配置管理、集群管理等功能&#xff0c;从而帮助用户构建高可用、高性能的分布式系统。以下是Zookeeper的一些主要特点和功能&…

Java注解的入门学习

一、概念 Java注解是一种元数据形式&#xff0c;可以被添加到Java代码中的各种元素&#xff08;类、方法、字段等&#xff09;上&#xff0c;以提供关于这些元素的额外信息。注解是在Java 5中引入的一项特性&#xff0c;它们不直接影响代码的执行&#xff0c;而是提供了一种机…

顺序表算法练习

一.顺序表基础算法 1.说明 博主这里是算法练习&#xff0c;帅气的读者来这里默认已经知道了它&#xff0c;这里主要是针对408考研真题中关于线性表的算法题进行编写。第一部分是根据课本编写线性表的基本函数&#xff0c;剩下四个部分是针对考研真题的算法练习。 2.C语言代码…