一、前言
废话不多说,写这个作为串口模板,后续会继续补充其他模板,有相识功能直接复制模板里东西到程序中,直接使用,无需大的调整,为自己模板记录,也提供给需要的朋友们。
二、环境
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关闭界面还要删除掉串口,有时搞不好还总死机,继承之后窗口关闭连带着继承的串口也被销毁,下次在进入此界面重新初始化。