作者:zzssdd2

E-mail:zzssdd2@foxmail.com

一、前言

主要实现功能

  • 串口参数的配置:波特率数据位停止位校验位
  • 本机串口设备的查询与添加显示
  • 串口设备的手动更新与打开关闭

涉及的知识点

  • 串口类QSerialPortQSerialPortInfo的使用
  • 自定义波特率的实现
  • QComboBox下拉列表自适应文本长度显示
  • 控件QPushButtonQComboBox的使用

二、功能实现

下面开始逐步讲解以上列举的功能

2.1、串口设备的查询添加

创建一个串口设备信息列表和串口设备号列表,遍历本机可用串口然后添加到列表中,将设备信息列表显示在对应的QComboBox控件中,设备号列表用来后面打开串口设备使用。

/* 遍历可用串口设备 */
QStringList SerialPort_Name;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
SerialPort_Name << info.portName()+':'+info.description();
serialDevice << info.portName();
}
/* 添加到串口设备显示框 */
ui->SerialNum_Box->addItems(SerialPort_Name);

此时已经将串口设备信息添加到下拉框中了,但是下拉框此时是固定长度,如果串口设备信息比较长则无法显示完全(以省略号展示),那么就需要实现下拉框根据设备信息字符串长度适配功能。原理就是遍历列表中所有设备信息字符串的长度,找处最大值然后将下拉框长度设置到能完全显示最大长度字符串。

/* 获取最长字符串 */
int maxlen = 0;
for (int index = 0; index < ui->SerialNum_Box->count(); index++)
{
if (ui->SerialNum_Box->itemText(index).length() > maxlen)
{
maxlen = ui->SerialNum_Box->itemText(index).length();
}
}
/*获取字体磅值转换为像素值*/
int fontsize = ui->SerialNum_Box->font().pointSize();//获取字体的磅值
ui->SerialNum_Box->view()->setFixedWidth(fontsize * maxlen * 0.75);//设置像素值

这里涉及到字体磅值与像素值对应关系,因为setFixedWidth函数参数单位是像素。添加该功能后前后对比:

2.2、串口参数的配置

这部分功能实现串口参数的配置,主要有波特率、数据位、停止位、校验位等,根据下拉框选择的参数进行配置。

/* 设置波特率 */
switch (ui->Bandrate_Box->currentIndex())
{
case 0:
serial->setBaudRate(QSerialPort::Baud1200,QSerialPort::AllDirections);
break;
case 1:
serial->setBaudRate(QSerialPort::Baud2400,QSerialPort::AllDirections);
break;
case 2:
serial->setBaudRate(QSerialPort::Baud4800,QSerialPort::AllDirections);
break;
case 3:
serial->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);
break;
case 4:
serial->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections);
break;
case 5:
serial->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);
break;
case 6:
serial->setBaudRate(QSerialPort::Baud57600,QSerialPort::AllDirections);
break;
case 7:
serial->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);
break;
case 8:
/*自定义波特率*/
default:
break;
}
/* 设置数据位 */
switch (ui->Databit_Box->currentIndex()) {
case 0:
serial->setDataBits(QSerialPort::Data5);
break;
case 1:
serial->setDataBits(QSerialPort::Data6);
break;
case 2:
serial->setDataBits(QSerialPort::Data7);
break;
case 3:
serial->setDataBits(QSerialPort::Data8);
break;
default:
break;
}
/* 设置停止位 */
switch (ui->Stopbit_Box->currentIndex()) {
case 0:
serial->setStopBits(QSerialPort::OneStop);
break;
case 1:
serial->setStopBits(QSerialPort::OneAndHalfStop);
break;
case 2:
serial->setStopBits(QSerialPort::TwoStop);
break;
default:
break;
}
/* 设置校验位 */
switch (ui->Parity_Box->currentIndex()) {
case 0:
serial->setParity(QSerialPort::NoParity);
break;
case 1:
serial->setParity(QSerialPort::EvenParity);
break;
case 2:
serial->setParity(QSerialPort::OddParity);
break;
default:
break;
}
/* 设置流控制 */
serial->setFlowControl(QSerialPort::NoFlowControl);

如果没有BaudRate枚举项则需要设置自定义波特率,实现如下:

qint32 CustomBandrate = ui->Bandrate_Box->currentText().toUInt();
serial->setBaudRate(CustomBandrate, QSerialPort::AllDirections);

如果选择了自定义波特率,则将下拉框设为可编辑,否则设为不能编辑

connect(ui->Bandrate_Box, QOverload<int>::of(&QComboBox::currentIndexChanged),[=](int index){
if (index == 8) {
ui->Bandrate_Box->setEditable(true);
ui->Bandrate_Box->setCurrentText(NULL);
} else {
ui->Bandrate_Box->setEditable(false);
}
});

参数配置列表如下:

2.2、串口打开与关闭

串口开关按钮槽函数实现内容

/*
函 数:on_SerialPortSwitch_Bt_clicked
描 述:开关串口按键点击槽函数
输 入:无
输 出:无
*/
void Widget::on_SerialPortSwitch_Bt_clicked()
{
if (ui->SerialPortSwitch_Bt->text() == "打开")
{
/* 创建串口对象 */
serial = new QSerialPort(this);
/* 创建接收数据信号槽 */
connect(serial, &QSerialPort::readyRead, this, &Widget::SerialPortReadyRead_slot);
/* 设置串口号 */
QString dev = serialDevice.at(ui->SerialNum_Box->currentIndex());
serial->setPortName(dev);
/* 设置波特率 */
/* 设置数据位 */
/* 设置停止位 */
/* 设置校验位 */
/* 设置流控制 */
/* 打开串口 */
if (serial->open(QIODevice::ReadWrite) != true)
{
QMessageBox::critical(this, "提示", "打开失败");
return;
}
/*标记串口已打开*/
global_struct.isSerialOpen = true;
/*设置文本*/
ui->SerialPortSwitch_Bt->setText("关闭");
}
else
{
/*关闭并删除串口对象*/
serial->close();
serial->deleteLater();
/*标记串口已关闭*/
global_struct.isSerialOpen = false;
/*设置文本*/
ui->SerialPortSwitch_Bt->setText("打开");
}
}

2.3、串口设备的刷新

串口设备刷新按钮槽函数功能

/*
函 数:on_ComFlush_BT_clicked
描 述:串口设备刷新按钮槽函数
输 入:无
输 出:无
*/
void Widget::on_ComFlush_BT_clicked()
{
ui->SerialNum_Box->clear();
FindSerialPort();
} /*
函 数:FindSerialPort
描 述:查找串口并添加到QComboBox
输 入:无
输 出:无
*/
void Widget::FindSerialPort(void)
{
/* 遍历可用串口并添加到显示框 */
QStringList SerialPort_Name;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
SerialPort_Name << info.portName()+':'+info.description();
serialDevice << info.portName();
}
ui->SerialNum_Box->addItems(SerialPort_Name);
/*设置下拉框列表宽度*/
int maxlen = 0;
for (int index = 0; index < ui->SerialNum_Box->count(); index++)
{
if (ui->SerialNum_Box->itemText(index).length() > maxlen)
{
maxlen = ui->SerialNum_Box->itemText(index).length();
}
}
int fontsize = ui->SerialNum_Box->font().pointSize();
ui->SerialNum_Box->view()->setFixedWidth(fontsize * maxlen * 0.75);
}

QT串口助手(二):参数配置的更多相关文章

  1. QT串口助手(三):数据接收

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的接收 ascii字符形式显示与hex字符形式显 ...

  2. QT串口助手(五):文件操作

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 功能 文件的发送 数据的保存 知识点 QFile类的使用 QTime ...

  3. QT串口助手(四):数据发送

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...

  4. 串口助手下载-带时间戳的串口助手-极简串口助手-V1.1 自动保存配置参数 能显示收发时间方便调试

    1.串口助手下载 2.带时间戳的串口助手,每次收发指令带上了时间戳,方便调试 3.极简串口助手 4.简单易用 高速稳定 5.每次修改的参数都能自动保存,免去了重复配置的工作 下载地址:http://w ...

  5. Qt小项目之串口助手控制LED

    Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...

  6. qt configure参数配置介绍

    ======================================全文是按照./configure -help来翻译的==================================== ...

  7. 通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  8. Qt 新手实战项目之手把手打造一个串口助手

    一前景 很多时候我们在学习一门新的语言,一直在学习各种语法和记住各种关键字,很容易产生枯燥的情绪,感觉学习这些玩意儿不知道用在什么地方,心里很是苦恼,这不,我在这记录下我学习Qt的第一个的小项目-串口 ...

  9. 基于python的接口测试框架设计(二)配置一些参数及文件

    基于python的接口测试框架设计(二)配置一些参数及文件 我这里需要基于我的项目配置的主要是登陆参数.以及baseURL ,把这些放在单独的文件里  毕竟导入的时候方便了一些 首先是url 图略 建 ...

随机推荐

  1. 1款开源工具,实现自动化升级K3S集群!

    即便你的集群能够平稳运行,Kubernetes升级依旧是一项艰难的任务.由于每3个月Kubernetes会发布一个新版本,所以升级是十分必要的.如果一年内你不升级你的Kubernetes集群,你就会落 ...

  2. Java8 - Stream流:让你的集合变得更简单!

    前段时间,在公司熟悉新代码,发现好多都是新代码,全是 Java8语法,之前没有了解过,一直在专研技术的深度,却忘了最初的语法,所以,今天总结下Stream ,算是一份自己理解,不会很深入,就讲讲常用的 ...

  3. 任务队列--nodejs

    很多项目可能都会涉及到任务队列来进行任务处理和维护的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量,但是对于saas部署来说使用redis可能会比较麻烦和成 ...

  4. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  5. 不一样的资产安全 3D 可视化平台

    前言   数字经济时代,应用好数据是企业数字化转型的关键,基于前沿科学技术进行数据的有效管控,更是对数字增值服务的新趋势.近年来,整个安全行业对资产管理的重视程度正在提高.据IDC发布的相关数据显示, ...

  6. Python十大装B语法!你会几种?

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python ...

  7. Autofac的基本使用---5、常用配置

    Autofac的基本使用---目录 创建实例方法 参考:http://www.cnblogs.com/manglu/p/4115128.html InstancePerDependency 对每一个依 ...

  8. [leetcode]48RotateImage二维数组翻转

    import java.util.Arrays; /** * You are given an n x n 2D matrix representing an image. Rotate the im ...

  9. 重温Java JDK安装,希望帮助更多的学习在路上的小白

    JDK卸载和安装 现在JDK已经升级到JDK11版本了,但是JDK1.8(JDK8)仍然有很多小伙伴在使用,这里也记录一下jdk1.8的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略, ...

  10. ssh 免密设置

    在master中生成dsa: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/author ...