网站建设与维护案列/郑州做网站推广资讯

网站建设与维护案列,郑州做网站推广资讯,wordpress js广告,南京编程培训机构目录 一、前言 二、串口助手实现 2.1、串口 2.1.1、可用串口信息-QSerialPortInfo 2.1.2、打开串口-QSerialPort 2.1.3、串口发送接收信息 2.2、定时器-QTimer 2.3、常用属性类型转换(会更新) 2.4、子控件组规则命名优化 一、前言 这个是学习Q…

目录

一、前言

二、串口助手实现

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

 2.1.2、打开串口-QSerialPort

2.1.3、串口发送接收信息 

2.2、定时器-QTimer

2.3、常用属性类型转换(会更新)

2.4、子控件组规则命名优化


一、前言

这个是学习QT中实现的一个小项目——串口助手,这里是根据串口助手制作过程中所需要使用的类和插件制作的一个笔记,方便以后成为我们的技术库,很方便于我们日后开发!                          串口助手模样:

二、串口助手实现

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

每学习一个类,我们都需要去查手册,查看它的成员还有使用前提,我们才能更好的使用起来:

说明需要添加:

 函数原型:

QList<QSerialPortInfo> QSerialPortInfo::availablePorts()QList<qint32> QSerialPortInfo::standardBaudRates()

我们使用上面这个类的这两个函数就可以得到地电脑当前可使用的端口和波特率了,这里我们做个小demo将其打印出来:

#include <QSerialPortInfo>#include <QDebug> //显示可用的串口端口QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts();for(QSerialPortInfo serialInfo : serialList)//遍历容器{qDebug() << serialInfo.portName();//打印可用的端口号ui->comboBox_serialNum->addItem(serialInfo.portName());//添加标签}//显示电脑可用的波特率QList<qint32> serialbotelv = QSerialPortInfo::standardBaudRates();for(qint32 serialbotelvInfo : serialbotelv)//遍历容器{qDebug() << serialbotelvInfo;}

运行结果:

 2.1.2、打开串口-QSerialPort

使用一个串口需要配置很多参数,相同打开一个串口也需要提前配置好参数:

QSerialPort::QSerialPort(QObject *parent = nullptr)
用给定的父对象构造一个新的串行端口对象。

使用案例:

QSerialPort *serialPort;
serialPort = new QSerialPort(this);//为串口创建一个空间

构造好串口端口对象后,接下来就是配置参数了,配置参数的函数也不难找到,在类中的public Functions里面:找到函数后,再根据函数的参数找到对应自己组要的配置即可。

这里以配置数据位为代表:

bool setDataBits(QSerialPort::DataBits dataBits)

然后在看它的参数是DataBits类型,然后我们再去手册查找 

找到公共类型点进去,找到自己要找的: 

最后再根据代码逻辑实现即可:学习QT最重要的就是学会查手册 

    //1. 选择端口号serialPort->setPortName(ui->comboBox_serialNum->currentText());//2. 配置波特率serialPort->setBaudRate(ui->comboBox_boautrate->currentText().toInt());//3. 配置数据位serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_databit->currentText().toUInt()));//4. 配置校验位switch (ui->comboBox_jiaoyan->currentIndex()) {case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:break;serialPort->setParity(QSerialPort::EvenParity);case 2:serialPort->setParity(QSerialPort::MarkParity);break;case 3:serialPort->setParity(QSerialPort::OddParity);break;case 4:serialPort->setParity(QSerialPort::SpaceParity);break;default:serialPort->setParity(QSerialPort::UnknownParity);break;}//5. 配置停止位serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_databit->currentText().toUInt()));//6. 流控if(ui->comboBox_fileCon->currentText() == "None")serialPort->setFlowControl(QSerialPort::NoFlowControl);//7. 打开串口if(serialPort->open(QIODevice::ReadWrite)){qDebug() << "serial open success";}

运行结果:

2.1.3、串口发送接收信息 

发送信息:

const char* sendData = ui->lineEditSendContext->text().toStdString().c_str();
serialPort->write(sendData);//串口发送信息
qDebug() << "SendOK" << sendData;//打印信息验证
ui->textEditRecord->append(sendData);//将发送的信息添加到历史记录文本里面

接收信息:

接收信息和单片机一样,有信息来了就会有一股“感觉”来临,这个“感觉”在QT中就是我们常用的信息了,我们要利用好这个感觉,感觉来了就处理!我们可以查看手册这个类的信息有哪些?

发现这个类中没有和接收信息相关的信息,所以我们要往上查,查他的父类(子承父业): 

所以我们还是老套路,绑定信号和槽,声明定义槽函数: (这里就不展示槽的声明了)

//串口接收信号readyRead连接
connect(serialPort,&QSerialPort::readyRead,this,&Widget::on_SerialData_readyToRead);//串口读取槽函数
void Widget::on_SerialData_readyToRead()
{QString revMessage = serialPort->readAll();qDebug() << "getMessage:"<< revMessage;ui->textEditRev->append(revMessage);//将接收的信息记录在文本上
}

2.2、定时器-QTimer

定时器和单片机中的定时器使用都是类似的,使用起来并不难,QT配合手册可以更灵活使用:

.h文件class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_checkBox_clicked();void on_checkBox_clicked(bool checked);private:Ui::Widget *ui;QTimer *timer;//定时器变量声明
};.c文件Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);//为定时器创建一个空间connect(timer,&QTimer::timeout,[=](){//定时器信号与槽绑定qDebug() << "timer out!";//时间到了干什么});
}Widget::~Widget()
{delete ui;
}//按键按下定时器开始
void Widget::on_pushButton_clicked()
{timer->start(1000);
}
//按键按下定时器结束
void Widget::on_pushButton_2_clicked()
{timer->stop();
}

运行结果:

更多使用放方法可以查看手册: 

2.3、常用属性类型转换(会更新)

    QString String_data = "hello";//QString转const char*const char* char_data = String_data.toStdString().c_str();const char* char_data2 = String_data.toLocal8Bit().constData();//QString转int,其他整数类型也是使用类似函数转换String_data.toInt();//QString转Hex显示QByteArray qtmp = String_data.toUtf8();  //QString转QByteArrayqtmp = qtmp.toHex();                     //QString转HEXString_data = QString::fromUtf8(qtmp);                 //QByteArray转QStringqDebug() << String_data;//HEX显示转QStringQString temp = String_data;QByteArray temp2 = String_data.toUtf8();      //QString转QByteArray转QStringQByteArray temp3 = QByteArray::fromHex(temp2);//由HEX返回原来本质String_data = QString::fromUtf8(temp3);       //QByteArray转QStringqDebug() << String_data;

运行结果:

2.4、子控件组规则命名优化

在QT工作开发中我们难免会使用相同的子控件来执行大差不差的工作,比如实现一个小项目串口助手中这种情况,很多数量的按键都是实现相同的功能-发送

如果作为一个小白来说,我们肯定会使用大量的信号与槽来实现,一个按键对应一对信号与槽,这样就显的代码太过于臃肿了,为了简洁,可以使用通过给子控件规则命名配合事件的使用来简单化代码: 

1.我们首先需要给子控件规则命名:

2.然后

注意:头文件中需要声明槽函数.c文件
QList<QPushButton *> buttons;
for(int i = 1; i <= 9; i++){QString btnName = QString("pushButton_%1").arg(i);//建立命名QPushButton* btn = findChild<QPushButton *>(btnName);//寻找子控件中QPushButton类中是否有btnNameif(btn){//如果有btn->setProperty("buttonId",i);//设置它的属性IDbuttons.append(btn);//统一绑定一个槽,然后在这个槽on_command_button_clicked里面进行处理connect(btn,SIGNAL(clicked()),this,SLOT(on_command_button_clicked()));}
}//槽处理
void Widget::on_command_button_clicked()
{QPushButton *btn = qobject_cast<QPushButton *>(sender());//查看谁是发送信号的按键if(btn){int num = btn->property("buttonId").toInt();//将它的属性ID转换出来QString lineEditName = QString("lineEdit_%1").arg(num);//根据ID找对应的横线文本QLineEdit *lineEdit = findChild<QLineEdit *>(lineEditName);if(lineEdit)ui->lineEditSendContext->setText(lineEdit->text());QString checkBoxName = QString("checkBox_%1").arg(num);//根据ID找对应的CheckboxQCheckBox *checkBox = findChild<QCheckBox *>(checkBoxName);if(checkBox)ui->checkBHexSend->setChecked(checkBox->isChecked());on_btnSendContext_clicked();//发送信息}
}

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

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

相关文章

Word 小黑第40套

对应大猫43 主题 -浏览主题 -选择W样式标准文件就行 1级段落和2级段落&#xff08;用项目符号不影响原本段落文字符号 颜色修改为自动&#xff09; 整段变红的 不是把光标定位到红色字体那里 要选择几个红色字体 再创建样式 插入的空白页一定要是下一页&#xff0c;不能插空白…

基于yolo11+flask打造一个精美登录界面和检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示&#xff0c;代码仅仅有2个html文件和一个python文件&#xff0c;真正做到了用最简洁的代码实现复杂功能。 测试通过环境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

SQLMesh系列教程:利用date_spine宏构建日期序列实践指南

引言&#xff1a;为什么需要日期维度表&#xff1f; 在数据分析和报表开发中&#xff0c;日期维度表是不可或缺的基础结构&#xff0c;其中包括一定日期范围的日期序列&#xff0c;每个序列包括对应日期属性&#xff0c;如年季月日、是否周末等。无论是计算日粒度销售额、分析…

【蓝桥杯】省赛:神奇闹钟

思路 python做这题很简单&#xff0c;灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…

2024浙江大学计算机考研上机真题

2024浙江大学计算机考研上机真题 2024浙江大学计算机考研复试上机真题 2024浙江大学计算机考研机试真题 2024浙江大学计算机考研复试机试真题 历年浙江大学计算机复试上机真题 历年浙江大学计算机复试机试真题 2024浙江大学计算机复试上机真题 2024浙江大学计算机复试机试真题 …

Typora 使用教程(标题,段落,字体,列表,区块,代码,脚注,插入图片,表格,目录)

标题 一个#是一级标题, 2个#是二级标题, 以此类推, 最多可达六级标题 示例 输入#号和标题后回车即可 注意: #和标题内容之间需要存在空格(一个或多个均可), 没有空格就会变成普通文字 标题快捷键 Ctrl数字 1-6 可以快速调成对应级别的标题 (选中文本/把光标放在标题上再按…

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换&#xff1a;隐式与显式转换的机制与应用 在C#的强类型体系中&#xff0c;数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系&#xff0c;或对象类型存在继承层次时&#xff0c;系统通过预定义的转换规则实现类型兼容处理。隐式转换&…

Linux FILE文件操作2- fopen、fclose、fgetc、fputc、fgets、fputs验证

目录 1.fopen 打开文件 1.1 只读打开文件&#xff0c;并且文件不存在 1.2 只写打开文件&#xff0c;并且文件不存在 1.3 只写打开文件&#xff0c;并且文件存在&#xff0c;且有内容 1.4 追加只写打开文件&#xff0c;并且文件不存在 2. fclose 关闭文件 3. fgetc 读取一…

如何检查CMS建站系统的插件是否安全?

检查好CMS建站系统的插件安全是确保网站安全的重要环节&#xff0c;对于常见的安全检查&#xff0c;大家可以利用以下几种有效的方法和工具&#xff0c;来帮你评估插件的安全性。 1. 检查插件来源和开发者信誉 选择可信来源&#xff1a;仅从官方插件库或可信的第三方开发者处…

使用Dependency Walker和Beyond Compare快速排查dll动态库损坏或被篡改的问题

目录 1、问题描述 2、用Dependency Walker工具打开qr.dll库&#xff0c;查看库与库的依赖关系以及接口调用情况&#xff0c;定位问题 3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll的差异 4、最后 C软件异常排查从入门到精通系列教程&#xff…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…

【大模型】Transformer、GPT1、GPT2、GPT3、BERT 的论文解析

前言 在自然语言处理&#xff08;NLP&#xff09;和深度学习的快速发展中&#xff0c;Transformer模型和 GPT系列模型扮演了至关重要的角色。本篇博客旨在对这些开创性的论文进行介绍&#xff0c;涵盖它们的提出时间、网络结构等关键信息&#xff0c;能够快速的理解这些模型的设…

OpenGL ES 入门指南:从基础到实战

引言&#xff1a;为什么需要 OpenGL ES&#xff1f; 在当今的嵌入式设备&#xff08;如智能手机、汽车仪表盘、智能家居中控屏&#xff09;中&#xff0c;流畅的图形渲染能力是用户体验的核心。OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09; 作为行业标准&am…

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ &#xff08;一&#xff09;汇编指令的一般格式 &#xff08;二&#xff09;按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机&#xff08;或单片机&#xff09;中 CPU 能够识别并执行的基本操作命令…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; B - Ticket Gate Log 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; C - Variety Split Easy 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; D - Cubes 翻译&#xff1a…

Spring Cloud Gateway 生产级实践:高可用 API 网关架构与流量治理解析

API 网关的核心价值 在分布式微服务架构中&#xff0c;API 网关作为系统流量的唯一入口&#xff0c;承担着路由分发、安全防护、流量治理三大核心职责。Spring Cloud Gateway 基于响应式编程模型与 Netty 高性能网络框架&#xff0c;提供灵活的路由规则、动态过滤器链和深度集…

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后&#xff0c;终于找到的解决的方案&#xff0c;遂将该方法简要的记录下来&#xff0c;以备后用&#xff0c;并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下&#xff0c;假…

集成学习(上):Bagging集成方法

一、什么是集成学习&#xff1f; 在机器学习的世界里&#xff0c;没有哪个模型是完美无缺的。就像古希腊神话中的"盲人摸象"&#xff0c;单个模型往往只能捕捉到数据特征的某个侧面。但当我们把多个模型的智慧集合起来&#xff0c;就能像拼图一样还原出完整的真相&a…

Springboot+Vue登录、注册功能(含验证码)(后端!)

我们首先写一个接口&#xff0c;叫login&#xff01;然后对传入一个user&#xff0c;因为我们前端肯定是要传过来一个user&#xff0c;然后我们后端返回一个user&#xff0c;因为我们要根据这个去校验&#xff01;我们还引入了一个hutool的一个东西&#xff0c;在pom文件里面引…

冯 • 诺依曼体系结构

冯 • 诺依曼体系结构 一、冯 • 诺依曼体系结构推导阶段 1&#xff1a;初始计算机体系结构&#xff08;仅输入、运算、输出&#xff09;阶段 2&#xff1a;加入控制功能&#xff0c;初步形成 CPU 概念阶段 3&#xff1a;性能瓶颈与引入内存阶段 4&#xff1a;最终冯诺依曼体系…