qt串口配置(端口号列表选择/自动保存/初始化模板)复制粘贴直接用

news2024/11/17 1:57:08

一、前言

        废话不多说,写这个作为串口模板,后续会继续补充其他模板,有相识功能直接复制模板里东西到程序中,直接使用,无需大的调整,为自己模板记录,也提供给需要的朋友们。

二、环境

qt5.7 window

sqlite3

三、正文

串口配置唯一使用到了数据库,作为端口号记录

数据库如下:

1.pro文件中加入

QT       += core gui serialport sql

2.头文件包含

#include <QtSql>
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSerialPort>
#include <QSerialPortInfo>

3.menu.h

#ifndef MENU_H
#define MENU_H

#include "common.h"



namespace Ui {
class menu;
}

class menu : public QWidget
{
    Q_OBJECT

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

private slots:
    void receivelogin(QString,QString,bool,QString);//接收登录用户信息


    bool open_serialport1(bool reset,QString comstr);
    void serialRead1();//串口回调函数
    void comBatAnalyze1(QByteArray &allData);//处理串口得到的数据
    
    

private:
    Ui::menu *ui;

    QSerialPort *serial1;//串口句柄
    QSerialPort *serial2;//串口句柄

};

#endif // MENU_H

4.menu.cpp

#include "menu.h"
#include "ui_menu.h"
#include "mainwindow.h"
#include "login.h"
menu::menu(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::menu)
{
    ui->setupUi(this);


    //读取历史串口1使用信息
    QSqlQuery qry(db);
    QString port1;
    if(qry.exec("select * from Sys_serverport")&&qry.next())//读取上次用户登录信息,自动赋值
        port1=qry.value(1).toString();
    bool openflag1=open_serialport1(0,port1);//初始化打开上次设置串口号,并返回开启状态
    if(openflag1==false){//打开串口失败,提示信息 设置按键状态
        QTimer::singleShot(1000,this,[=](){massage_dialog(1,"提示","检测平台内部通讯串口打开失败!请检查串口是否占用或线缆连接状况!",1);});
        ui->btn_openserverport1->setText("打开串口");
        ui->btn_openserverport1->setStyleSheet("color: rgb(0, 0, 0);");
    }
    else{//串口1打开成功
        ui->btn_openserverport1->setText("关闭串口");
        ui->btn_openserverport1->setStyleSheet("color: rgb(255, 0, 0);");
    }
    //绑定串口1刷新按键,并执行一次刷新串口号到combox控件
    connect(ui->pushButton_refresh,&QPushButton::clicked,[=](){//串口按键回调函数
        ui->comboBox_serverport1->clear();
        //遍历当前系统能检测到的所有串口端口号
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
            QSerialPort serial;
            serial.setPort(info);
            ui->comboBox_serverport1->addItem(serial.portName());
        }
        ui->comboBox_serverport1->setCurrentText(serial1->portName());//首选项显示当前或上次连接的端口号
    });
    ui->pushButton_refresh->click();//点击一次刷新按键
    //绑定串口1连接按键
    connect(ui->btn_openserverport1,&QPushButton::clicked,[=](){//连接按键回调函数,成功保存,失败提示
        if(ui->btn_openserverport1->text()=="打开串口"){//判断当前串口是未打开的
            bool openflag1=open_serialport1(1,ui->comboBox_serverport1->currentText());//点击按键打开当前combox选择的串口号,并返回开启状态
            if(openflag1==false){//打开串口失败,提示信息 设置按键状态
                massage_dialog(1,"提示","检测平台内部通讯串口打开失败!请检查串口是否占用或线缆连接状况!",1);
                ui->btn_openserverport1->setText("打开串口");
                ui->btn_openserverport1->setStyleSheet("color: rgb(0, 0, 0);");
            }
            else{//串口1打开成功
                ui->btn_openserverport1->setText("关闭串口");
                ui->btn_openserverport1->setStyleSheet("color: rgb(255, 0, 0);");
                //保存手动打开的串口,下次开机打开此串口
                QSqlQuery qry(db);//数据库保存
                qry.exec(QString("UPDATE Sys_serverport set port1='%1' where id = 1;").arg(ui->comboBox_serverport1->currentText()));
            }
        }
        else{//否则判断串口1是已经打开的,需要关闭操作
            serial1->clear();//先关闭之前的串口
            serial1->close();
            ui->btn_openserverport1->setText("打开串口");
            ui->btn_openserverport1->setStyleSheet("color: rgb(0, 0, 0);");
        }
    });

}

menu::~menu()
{
    delete ui;
}

//初始化/复位串口
bool menu::open_serialport1(bool reset,QString comstr)
{
    if(reset){
        serial1->clear();//先关闭之前的串口
        serial1->close();
    }
    ui->comboBox_serverport1->setCurrentText(comstr);
    serial1 = new QSerialPort(this);
    serial1->setPortName(comstr);
    serial1->open(QIODevice::ReadWrite);//读写打开
    serial1->setBaudRate(QSerialPort::Baud115200);  //波特率QSerialPort::Baud9600
    serial1->setDataBits(QSerialPort::Data8); //数据位
    serial1->setParity(QSerialPort::NoParity);    //无奇偶校验
    serial1->setStopBits(QSerialPort::OneStop);   //无停止位
    serial1->setFlowControl(QSerialPort::NoFlowControl);  //无控制
    connect(serial1,SIGNAL(readyRead()),this,SLOT(serialRead1()));//连接串口读取函数
    return serial1->isOpen();
}
//串口1回调函数
void menu::serialRead1()
{
    static QByteArray allData;
    while (!serial1->atEnd()){
        allData += serial1->readAll().toHex();
        comBatAnalyze1(allData);//处理串口得到的数据
    }
}

/*****************************通用处理函数**********************************/

//处理串口1得到的数据
void menu::comBatAnalyze1(QByteArray &allData)
{

 
}

数据处理部分可见这个帖子:数据接收处理方式

5.ui控件

 模板中只有串口选择,刷新,串口操作是有效控件,其余控件默认参数不更改

把这些部分复制到你的新建程序中,修改一下控件名称,串口通用初始化和配置工作完毕。

总结:

       本模板主要实现的是模拟串口调试助手串口配置部分,含记忆功能,使用sqlite3数据库,在开机后自动读取数据库中上次配置串口号,如果线缆断开或串口号被占用等原因导致串口连接失败,会提示信息。

        然后可以刷新串口combox控件,将目前电脑能识别的所有串口号都识别显示出来,不管是已经占用的还是未占用的,只要是设备管理器“端口”中有的,这里都显示,然后选择一个想要用的,再点击打开串口,如果连接成功,会保存此端口名称到数据库,下次登录自动登录此端口,如果连接失败,同样提示信息。

        在已连接成功串口后再次点击刷新仍然会刷新电脑全部能识别的端口,combox中当前显示的为已连接或上次连接的端口号,端口号不会重复显示。

四、结语

串口通用配置模板:

1.在以前常规的用法上,修改了刷新端口过滤掉已连接的,将所有的识别端口都列入在combox中,避免了判断当前串口端口是否连接,还要不要刷新等繁杂的逻辑处理,直接列出所有端口,连接不上就提示,连接上就使用

2.修改串口初始化部分,将串口类继承到this当前窗口,不是独立的控件,否则在ui关闭界面还要删除掉串口,有时搞不好还总死机,继承之后窗口关闭连带着继承的串口也被销毁,下次在进入此界面重新初始化。

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

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

相关文章

R15.3-15.3-15.3-15.3A_哈威泵_样本及应用

R15.3-15.3-15.3-15.3A_哈威泵_样本及应用R11.8-11.8-11.8-11.8-BABSL_水泥行业用主用于钢厂&#xff0c;油田&#xff0c;水利&#xff0c;飞机&#xff0c;压铸机等重型液压设备。 对油泵R11.8-11.8-11.8-11.8-BABSL_水泥行业用的维护保养应注意以下方面&#xff1a; 1.会腐…

项目需求及架构设计

第2章 项目需求及架构设计 2.1 项目需求分析 用户行为数据采集平台搭建 用户行为数据会以文件的形式存储在服务器&#xff0c;这个阶段需要考虑&#xff1a;采集用户行为数据使用的工具,需要提供详细的设计需求 如&#xff1a;flume&#xff0c;flume采用的 source、channel、…

HDFS的Shell操作

该文章主要为完成实训任务及总结&#xff0c;详细实现过程及结果见【参考文章】 参考文章&#xff1a;https://howard2005.blog.csdn.net/article/details/127170478 文章目录一、 三种Shell命令方式二、FileSystem Shell文档三、常用Shell命令四、实例练习1、创建目录2、查看目…

这位00后经历人生重大变故后,选择了智能家居,选择了Aqara绿米

作者 | 布斯 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn编者按&#xff1a;虽然概念由来已久&#xff0c;但智能家居如今依然属于新兴产业。而这样一个当今在全国范围遍地开花的新型商业存在&#xff0c;已经创造了许多的就业岗位与创业机会&#xff0c;也隐藏着许多让人回味的故事…

Profinet总线模拟输出模块

上电后&#xff0c;耦合器自动识别所有与之相连的 I/O 模块&#xff0c;并根据模块的类型、数据宽度和模块在节点中的位置创建内部本地过程映像。 如果添加、更改或移除 I/O 模块&#xff0c;会建立新的过程映像&#xff0c;过程数据地址会改变。在添加 I/O 模块时&#xff0c…

【MySQL】MySQL执行计划与SQL调优提高查询效率(优化篇)(实战篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Pixel Difference Networks for Efficient Edge Detection论文笔记

文章目录一、背景知识二、Pixel Difference Convolution&#xff08;PDC&#xff09;1.CPDC2.APDC3.RPDC三、轻量化边缘检测网络A. Block_x_yB. CSAMC. CDCMD. 1*1卷积层E. 深度监督&#xff08;deep supervision&#xff09;F. 损失函数四、实验结果1. 消融实验2.网络可扩展性…

SpringAMQP简介及简单使用

一、SpringAMQP简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; 自动声明…

Maven基础概念

仓库 仓库用于存储资源&#xff0c;包含各种jar包。 仓库分类&#xff1a; 本地仓库&#xff1a;自己电脑作为仓库&#xff0c;连接远程仓库获取资源。远程仓库&#xff1a;非本地的仓库&#xff0c;为本地仓库提供资源。中央仓库&#xff1a;由Maven团队维护&#xff0c;存…

【Servlet】4:详解请求对象 HttpServletRequest

目录 | 请求对象 HttpServletRequest接口 HttpServletRequest的基本概述 请求对象获取 URL & Method 请求对象获取 参数名 请求对象获取 参数值 参数值乱码问题 本文章属于后端全套笔记的第三部分 &#xff08;更新中&#xff09;【后端入门到入土&#xff01;】Java…

CAN电压测试

CAN总线&#xff1a; 一般用在汽车&#xff0c;伺服驱动器&#xff0c;步进驱动器&#xff0c;舵机&#xff0c;分布式io等设备上。 有以太网转CAN和4G网转CAN。 当然得到数据后&#xff0c;可以往RS485等上面转。 只需要2根线&#xff1a; H和L线&#xff0c;终端再并联120…

Linux history 命令相关使用以及配置

Linux history 命令相关使用以及配置 Linux history 新手学习 shell 的时候都知道 history 命令能帮助我们查看之前运行的命令集合&#xff0c;通过这个能够帮我们回忆之前的命令&#xff0c;以及进行各种排错等等。 比如我们直接输入 history 进行查看&#xff1a; histor…

Flutter高仿微信-第20篇-支付-充值

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.…

Android AIDL跨进程通信基础(多端情况)

简介 AIDL建议在来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL&#xff0c;其他情况下你都可以选择其他方法&#xff0c;如使用 Messenger&#xff0c;也能跨进程通信。可见 AIDL 是处理多线程、多客户端并发访问的&#xff0c;而 Messenger 是单线程…

年末盘点时间——用Python绘制饼状图对商品库存进行分析

人生苦短&#xff0c;我用python 存货盘点最重要的是什么&#xff0c;盘点比例要达到&#xff0c; 比如说要达到80%&#xff0c;于是就拿着企业给导的进销存明细表&#xff0c; 于是就开始筛选大金额的存货作为选择的样本&#xff0c; 这样就够比例了。 可是实际盘点的时候…

手把手教你在ARM板上写一个驱动程序!

摘要&#xff1a;搞嵌入式有两个方向&#xff0c;一个是嵌入式软件开发(MCU方向)&#xff0c;另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些&#xff0c;因为搞…

初阶指针---从入门到入坟

今天我们来见识一下c语言里让万千少年少女从入门到入坟的一道大门槛——指针 目录 1.指针是什么&#xff1f; 2.指针和指针类型 3.野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1.指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一…

C语言:计算阶乘与计算从1加到100的代码对比:都要用到3个变量,不同之处在于表达式

计算1 到 100 之间所有整数之和 #include <stdio.h> int main() {int i1,total0;while(i<100)//不能在 while 后面加分号{totali;i;//循环内要有使循环趋近于假的操作}printf("%d\n",total);return 0; } 和下面对比&#xff0c;只不过是100用输入j来代替了 …

将windows的显示器作为linux的扩展屏

这里写自定义目录标题前言WinLinuxRequirementsBuild and install运行前言 测试的linux系统为ubuntu 18.04测试的windows系统为win10将windows的显示器作为linux的扩展屏&#xff0c;需要使用微软的Miracast技术。windows自带就不多说了&#xff0c;linux使用的是这个开源软件…

MATLAB绘图合集:填充二维等高线图contourf

本文主要介绍填充的二维等高线图和基本的用法例子 目录 说明 例子 绘制10个层级的等高线 显示具有标签的特定层级的等高线图 自定义等高线线宽 说明 contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图&#xff0c;其中 Z 包含 x-y 平面上的高度值。MATLAB会自动选择…