程序示例精选
VS2022+Qt串口上位机控制系统
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言
这篇博客针对《VS2022+Qt串口上位机控制系统》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
文章目录
一、所需工具软件
二、使用步骤
1. 主要代码
2. 运行结果
三、在线协助
一、所需工具软件
1. VS2022, Qt
2. C++
二、使用步骤
代码如下(示例):
#include "SerialPort.h"
#include "ui_SerialPort.h"
#include <QSettings>
#include <qt_windows.h>
#include <QMessageBox>
#include <QDebug>
SerialPort::SerialPort(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::SerialPort)
{
ui->setupUi(this);
this->setWindowTitle(tr("串口调试助手 Qt版 V1.0"));
this->setFixedSize(this->width(), this->height());
m_nRecvNum = 0;
m_nSendNum = 0;
m_bOpen = false;
}
SerialPort::~SerialPort()
{
delete ui;
delete m_SerStateLbl;
delete m_RecvNumLbl;
delete m_SendNumLbl;
delete m_ResetNumBtn;
}
/***************************************************************************/
/* 初始化状态栏 */
/***************************************************************************/
void SerialPort::InitStatusBar()
{
m_SerStateLbl = new QLabel();
m_RecvNumLbl = new QLabel();
m_SendNumLbl = new QLabel();
m_ResetNumBtn = new QPushButton();
connect(m_ResetNumBtn, SIGNAL(clicked()), this, SLOT(slot_ResetNumBtn_clicked()));
m_SerStateLbl->setMinimumSize(180, 20);
m_RecvNumLbl->setMinimumSize(180, 20); // 标签最小尺寸
}
void SerialPort::SetSerState()
{
QString strState;
if ( m_bOpen )
strState = tr("打开");
else
strState = tr("关闭");
m_SerStateLbl->setText(tr("串口状态:%1").arg(strState));
}
void SerialPort::SetRecvNum()
{
QString strRecvNum = QString::number(m_nRecvNum);
m_RecvNumLbl->setText(tr("接收字节数:%1").arg(strRecvNum));
}
void SerialPort::SetSendNum()
{
QString strSendNum = QString::number(m_nSendNum);
m_SendNumLbl->setText(tr("发送字节数:%1").arg(strSendNum));
}
/***************************************************************************/
/* 初始化CombBox */
/***************************************************************************/
void SerialPort::InitCommCmb()
{
SetPortNumCmb(); // 串口号
SetBaudCmb(); // 波特率
SetDPaityCmb(); // 校验位
SetDataBCmb(); // 数据位
}
// 设置串口号
void SerialPort::SetPortNumCmb()
{
QStringList commPortList = GetEnableCommPortQt();
if ( !commPortList.isEmpty() )
ui->PortNumCmb->addItems(commPortList);
}
// 获取计算机可用串口 QSerialPort QSerialPortInfo类
QStringList SerialPort::GetEnableCommPortQt()
{
QStringList CommPortList;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite))
{
CommPortList.append(serial.portName());
serial.close();
}
}
return CommPortList;
}
// 获取计算机可用串口 Windows API
QStringList SerialPort::GetEnableCommPortWin()
{
QStringList CommPortList;
QString strCommPath = tr("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM");
QSettings *settings = new QSettings(strCommPath, QSettings::NativeFormat);
QStringList keyList = settings->allKeys();
return CommPortList;
}
// nIndex为索引号 bValue选择返回值为key还是value,默认为value
QString SerialPort::GetComm(int nIndex, bool bValue)
{
QString strCommRet = tr("");
HKEY hKey;
// RegOpenKeyEx windowsApi 成功返回0 需要加<qt_windows.h>头文件
if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0)
{
QMessageBox::warning(this, tr("注册表"), tr("无法打开注册表!"), QMessageBox::Ok);
return tr(""); // 无法打开注册表
}
QString strKeyMsg; // 键名
QString strValueMsg; // 键值
wchar_t keyName[256]; // 键名数组
char keyValue[256]; // 键值数组
if (::RegEnumValue(hKey, nIndex, keyName, &nKeySize, 0, &nType, (BYTE*)keyValue, &nValueSize) == 0) // 列举键名
{
// 读取键名
for (uint i = 0; i < nKeySize; i++)
{
if (keyName[i] != 0x00)
strKeyMsg.append(keyName[i]);
}
// 读取键值
for (uint j = 0; j < nValueSize; j++)
{
if (keyValue[j] != 0x00)
strValueMsg.append(keyValue[j]);
}
}//if
else
{
::RegCloseKey(hKey); // 关闭注册表
return tr(""); // 无可用串口
}
return strCommRet;
}
运行结果
三、在线协助:
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作
当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页:https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog
博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别:https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445
Python+Yolov5道路障碍物识别:https://blog.csdn.net/alicema1111/article/details/129589741
Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别:https://blog.csdn.net/alicema1111/article/details/129272048