QT串口助手的实现

2023-11-19

QT串口助手项目工程

serial.c

#include "serial.h"
#include "ui_serial.h"

serial::serial(QWidget *parent) : QWidget(parent),
                                  ui(new Ui::serial)
{
    ui->setupUi(this);
    system_init();
}

serial::~serial()
{
    delete timer;
    delete ui;
}
/***子函数代码区****/

//初始化控件
void serial::system_init()
{
    //自动搜索串口号
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
    // 禁止最大化按钮
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
    // 禁止拖动窗口大小
    setFixedSize(this->width(), this->height());
    //流控设置
    global_port.setFlowControl(QSerialPort::NoFlowControl);
    //按钮执行事件绑定  connect(信号发出者地址,发什么信号,在那个类触发,触发事件)
    //打开串口绑定
    connect(ui->btn_open, &QPushButton::clicked, this, &serial::btn_open);
    //搜索串口
    connect(ui->btn_search, &QPushButton::clicked, this, &serial::btn_search);
    //发送数据绑定
    connect(ui->btn_push, &QPushButton::clicked, this, &serial::btn_push_send);
    //接受数据
    connect(&global_port, &QSerialPort::readyRead, this, &serial::accept_date);
    //清除接受区域
    connect(ui->btn_del_accept, &QPushButton::clicked, this, &serial::del_Accept);
    //清除发送区域
    connect(ui->btn_del_push, &QPushButton::clicked, this, &serial::del_Send);
    //定时发送
    connect(ui->btn_tim_push, &QPushButton::clicked, this, &serial::timer_send);
    //停止发送
    connect(ui->btn_tim_off, &QPushButton::clicked, this, &serial::send_stop);
    //定时器
    connect(timer, SIGNAL(timeout()), this, SLOT(while_send()));
}
//串口信息配置函数
void serial::btn_open(bool)
{
    //打开串口
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    //先清除开始的串口信息
    ui->cmb_com->clear();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
    if (flag == 0 && count > 0)
    {
        flag = 1;
        //设置串口号
        QString Port_Name = ui->cmb_com->currentText();
        global_port.setPortName(Port_Name);
        //数据位宽
        switch (ui->cmb_date->currentIndex())
        {
        case 0:
            global_port.setDataBits(QSerialPort::Data8);
            break;
        case 1:
            global_port.setDataBits(QSerialPort::Data7);
            break;
        case 2:
            global_port.setDataBits(QSerialPort::Data6);
            break;
        default:
            global_port.setDataBits(QSerialPort::Data5);
            break;
        }
        //停止位
        switch (ui->cmb_stop->currentIndex())
        {
        case 0:
            global_port.setStopBits(QSerialPort::OneStop);
            break;
        case 1:
            global_port.setStopBits(QSerialPort::OneAndHalfStop);
            break;
        default:
            global_port.setStopBits(QSerialPort::TwoStop);
            break;
        }
        //奇偶校验
        switch (ui->cmb_parity->currentIndex())
        {
        case 0:
            global_port.setParity(QSerialPort::NoParity);
            break;
        case 1:
            global_port.setParity(QSerialPort::OddParity);
            break;
        default:
            global_port.setParity(QSerialPort::EvenParity);
            break;
        }
        //波特率
        switch (ui->cmb_bound->currentIndex())
        {
        case 0:
            global_port.setBaudRate(QSerialPort::Baud115200);
            break;
        case 1:
            global_port.setBaudRate(QSerialPort::Baud57600);
            break;
        case 2:
            global_port.setBaudRate(QSerialPort::Baud38400);
            break;
        case 3:
            global_port.setBaudRate(QSerialPort::Baud9600);
            break;
        case 4:
            global_port.setBaudRate(QSerialPort::Baud2400);
            break;
        default:
            global_port.setBaudRate(QSerialPort::Baud1200);
            break;
        }

        global_port.open(QSerialPort::ReadWrite);
        ui->btn_open->setText("关闭串口");
        ui->lab_state->setText("串口已打开");
    }
    else if (flag == 0 && count <= 0)
    {
        QMessageBox::information(this, tr("Error"), QStringLiteral("没有搜索到串口"), QMessageBox::Ok);
    }
    else
    {
        global_port.close();
        ui->btn_open->setText("打开串口");
        ui->lab_state->setText("串口未打开");
        flag = 0;
    }
}
//搜索串口函数
void serial::btn_search(bool)
{

    //自动搜索串口号
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    //先清除开始的串口信息
    ui->cmb_com->clear();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
}
//数据发送函数
void serial::btn_push_send(bool)
{
    QString str = ui->lint_send->text();

    //    要能正确发送中文字符,需要使用QString的toLocal8Bit方法
    //    serial->write(str.toLatin1());

    global_port.write(str.toLocal8Bit());
    global_port.write("\r\n");
}

//数据接受函数
void serial::accept_date()
{
    QByteArray buf;
    QString res;

    buf = global_port.readAll();
    res = QString(buf);

    if (!buf.isEmpty())
    {
        // 调试输出buf大小
        //qDebug()<<buf.size()<<endl;

        // 将QByteArray数据类型转换,要能正确显示中文,需要使用QString::fromLocal8Bit
        //        QString str = QString::fromUtf8( buf );
        QString str = QString::fromLocal8Bit(buf);

        // 如果以16进制显示数据:
        if (ui->cbox_hex->isChecked())
        {
            QString hex_data = buf.toHex().data(); // 将buf里的数据转换为16进制
            hex_data = hex_data.toUpper();         // 转换为大写
            QString hex_str;
            // 将16进制转换为大写
            for (int i = 0; i < hex_data.length(); i += 2)
            {
                QString st = hex_data.mid(i, 2);
                hex_str += st;
                hex_str += ' ';
            }
            ui->lint_accept->insertPlainText(hex_str);
        }
        else
        {
            ui->lint_accept->insertPlainText(str);
        }
    }

    buf.clear();
}
//清除接受区域函数
void serial::del_Accept(bool)
{
    ui->lint_accept->clear();
}
//清除发送区域函数
void serial::del_Send(bool)
{
    ui->lint_send->clear();
}
//定时发送函数
void serial::timer_send(bool)
{
    //timerEvent();
    QString ms = ui->lint_ms->text();
    //qDebug()<< ms;
    //按钮可用控制

    timer->start(ms.toInt());
    ui->btn_tim_push->setEnabled(false);
    ui->btn_tim_off->setEnabled(true);
}
//停止发送函数
void serial::send_stop(bool)
{
    timer->stop();
    //按钮可用控制
    ui->btn_tim_push->setEnabled(true);
    ui->btn_tim_off->setEnabled(false);
}
//定时器函数
void serial::while_send()
{
    QString str = ui->lint_send->text();
    global_port.write(str.toLocal8Bit());
    global_port.write("\r\n");
}

/****end*********/

serial.h文件

/*
 * @Author: Stylle
 * @Date: 2020-07-19 21:21:46
 * @LastEditors: Stylle
 * @LastEditTime: 2020-07-22 10:42:47
 * @FilePath: \tool-mastar\stylle_toolV1.8\serial.h
 */
#ifndef SERIAL_H
#define SERIAL_H

#include <QWidget>

/*******user include**********/

//串口头
#include <QSerialPort>
#include <QSerialPortInfo>
//定时器
#include <QTimer>
//串口号数组
#include <QList>
//消息弹窗
#include <QMessageBox>
/***********end***************/

namespace Ui
{
    class serial;
}

class serial : public QWidget
{
    Q_OBJECT

public:
    explicit serial(QWidget *parent = 0);
    ~serial();

private slots:
    //打开串口按钮函数
    void btn_open(bool);
    //搜索串口按钮函数
    void btn_search(bool);
    //发送信息按钮函数
    void btn_push_send(bool);
    //接受数据
    void accept_date();
    //清除接受
    void del_Accept(bool);
    //清除发送
    void del_Send(bool);
    //定时发送
    void timer_send(bool);
    //停止发送
    void send_stop(bool);
    //定时执行函数
    void while_send();

private:
    Ui::serial *ui;
    /***funtion****/
    //声明子函数
    void system_init();

    /***variable***/
    //声明变量
    QSerialPort global_port;
    //定时器变量
    QTimer *timer = new QTimer(this);
    //打开按钮状态
    bool flag = 0;
};

#endif // SERIAL_H

需要注意的是.pro文件中需要在QT+=中加上serialport才能使用串口模块
成品展示
QT串口助手

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

QT串口助手的实现 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Stream流还可以这样用,省时又省力,你不知道的去重方法,快来一起解决这道常见的面试题吧

    下面归纳出几种常见的去重方法 使用stream流collectingAndThen 根据某一属性去重 studentList studentList stream collect Collectors collectingAndThen C
  • Solidworks的simulation组合分析显示单独零件

    具体参考以下链接 https jingyan baidu com article f96699bbe98e8e894f3c1b59 html
  • QT QTabWidget

    QTabWidget 使用 1 1 ui界面添加tabWidget 想展示的Widget 1 2 TabWidget 动态添加tab 1 3 tabWidget 动态删除tab 1 4 TabWidget 获取所有tab的界面值 2 1 T
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 单链表——多项式相加

    时间限制 1000ms 内存限制 256M 实验目的 编写代码 使用两个单链表表示下面的多项式 完成两个多项式相加 并输出相加后的多项式结果 实验要求 1 单链表的类型定义如下 typedef int datatype 结点数据类型 假设为
  • Linux学习(八):文件名的查找Find

    Find 一 时间维度 atime ctime mtime 以 mtime为例 mtime n n为数字 意义为在n天之前的 一天之内 被更改过的文件 mtime n 列出在n天之前 不包含n本身 被更改过的文件 mtime n 列出在n天
  • linux超级工具,linux运维超级工具--sysdig

    sysdig 是一个超级系统工具 它可以用来捕获系统状态信息 在运维工作中sysdig能很方便的排查异常 定位故障 它还能保存数据进行分析 并且提供强大的命令接口 在了解sysdig强大之处之前 首先得安装sysdig 我这里是环境是cen
  • 【计算机网络13】网络安全

    文章目录 1 HTTP协议的安全问题 2 单向散列函数 One way hash function 2 1 单向散列函数的特点 2 2 常见的几种单向散列函数 2 3 防止数据被篡改 2 4 几个网站 3 对称加密 Symmetric Cr
  • Filebench 使用手册

    Filebench 使用手册 介绍 Filebench 是一个文件系统和存储基准 可以生成各种各样的工作负载 与典型的基准测试不同 它非常灵活 允许使用其广泛的工作负载模型语言 WML 指定应用程序的 I O 行为 用户可以从头开始描述所需
  • 当矩阵的秩小于未知数的个数时,方程组有无数个解;当矩阵的秩等于未知数的个数时,方程组只有零解。...

    当矩阵的秩小于未知数的个数时 方程组有无数个解 当矩阵的秩等于未知数的个数时 方程组只有零解 转载于 https www cnblogs com 2019 02 11 p 10586212 html
  • springboot配置启动后自动打开浏览器访问项目

    springboot配置项目启动后自动打开浏览器访问项目 有时候在单机部署 或者项目没有在IDea 开发工具中运行 idea可以自动打开tomcat项目 需要项目启动后自动打开浏览器访问项目 配置方法很简单 一 具体步骤 所用到的代码只有下
  • QT在图片中间绘制文字,获取文字size 和 pos

    QFont ft this gt font 获取系统当前字体对象 ft setPixelSize 15 设置字体大小 QFontMetrics fm QFontMetrics ft 创建字体计算类 double pixW fm width
  • 【基础】Flink -- ProcessFunction

    Flink ProcessFunction 处理函数概述 处理函数 基本处理函数 ProcessFunction 按键分区处理函数 KeyedProcessFunction 定时器与定时服务 基于处理时间的分区处理函数 基于事件时间的分区处
  • 用vscode创建一个c项目_vscode怎样编写c程序

    一 获取C C 扩展 1 打开vscode 2 ctrl shift x打开商店 3 搜索C C 安装 重启vscode 二 安装GCC 1 下载MinGW 2 打开安装程序 安装到D盘 需要创建MinGW文件夹 安装完成之后生成MinGW
  • (手工)【sqli-labs32-38】宽字节注入、报错回显、字符/数字型注入

    目录 一 推荐 二 手工 SQL注入基本步骤 三 Less32 GET Bypass custom filter adding slashes to dangerous chars 3 1 简介 宽字节注入 报错回显 字符型注入 3 2 第
  • JVM简介说明

    转自 JVM简介说明 下文笔者讲述JVM的简介说明 如下所示 JVM简介 JVM的功能是Java应用程序的运行环境 它是Java虚拟机 JVM用于运行java的字节码文件 JVM可以将字节码转换为硬件 操作系统指令 JVM用于同操作系统内层
  • 【HJ31】 单词倒排

    题目描述 对字符串中的所有单词进行倒排 说明 1 构成单词的字符只有26个大写或小写英文字母 2 非构成单词的字符均视为单词间隔符 3 要求倒排后的单词间隔符以一个空格表示 如果原字符串中相邻单词间有多个间隔符时 倒排转换后也只允许出现一个
  • ubuntu 串口助手通信收发数据不一致

    文章目录 问题背景 一 解决方案 1 直接更换硬件 靠这个解决的 2 其他参考 总结 问题背景 主机1 win10笔记本电脑 主机2 ubuntu16 04的宸曜工控机 主机3 ubuntu14 04的一个小盒子 串口助手 cutecom
  • pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门

    阅读该文章前 最好已经对 PMD 有了初步的认识和了解 可参考静态分析工具 PMD 使用说明 准备工作 首先在PMD 官网下载最新版本的文件 目前最新版本是 5 4 1 下载 pmd bin 5 4 1 zip 和 pmd src 5 4
  • QT串口助手的实现

    serial c include serial h include ui serial h serial serial QWidget parent QWidget parent ui new Ui serial ui gt setupUi