QT创建程序_串口助手_代码详解
程序员文章站
2022-06-22 18:53:50
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include "sqlwindow.h" //添加子窗口sqlwindow头文件#include //串口#include //系统时间#include //读写文件#include ....
目录
串口助手ui界面的设置
操作步骤请查看 QT创建程序_串口助手_界面布局
.pro的配置
代码添加serialport 为串口配置
QT += core gui serialport
.h头文件配置
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "sqlwindow.h" //添加子窗口sqlwindow头文件
#include <QSerialPort> //串口
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
bool getSerialPortConfig(void);
//ui界面的PushButton按钮右键转到槽点击后自动生成
private slots:
void on_BtnOpen_clicked();
void on_BtnSend_clicked();
void on_SerialPort_readyRead();
void on_BtnClear_clicked();
private:
Ui::MainWindow *ui;
private:
bool mIsOpen;//增加标志位
//生成类内成员
QSerialPort mSerialPort;
//设置成员变量,分别时串口名称,比特率,校验位,数据位,停止位
QString mPortName;
QString mBaudRate;
QString mParity;
QString mDataBits;
QString mStopBits;
};
#endif // MAINWINDOW_H
.cpp操作代码
添加头文件以及系统文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPortInfo> //串口信息(名称)
#include <QDebug> //调试窗口(输出)
动态识别串口号
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// To do user's work
mIsOpen = false;//设置开关变量
ui->BtnSend->setEnabled(mIsOpen);//ui界面的发送未使能,等待串口打开成功后开启
//动态识别当前系统的有效串口号
QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();//有效端口号的列表
int count = serialPortInfo.count();//计算串口数量
for(int i = 0 ; i < count; i++) //for循环遍历
{
//ui界面的下拉列表框(名称自定义的)增加项目内容为 串口索引位置的串口号名称
ui->CboxSerialPort->addItem(serialPortInfo.at(i).portName());
}
//连接串口发送信号,以及接收信号的槽
connect(&mSerialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPort_readyRead()));
}
MainWindow::~MainWindow()
{
delete ui;
}
串口配置(串口号,波特率,校验位,数据位,停止位)
//在.h文件中鼠标选中getSerialPortConfig再键盘按住alt+enter自动生成
bool MainWindow::getSerialPortConfig()
{
//获取串口配置
mPortName = ui->CboxSerialPort->currentText();
mBaudRate = ui->CboxBaurdRate->currentText();
mParity = ui->CboxParity->currentText();
mDataBits = ui->CboxDateBits->currentText();
mStopBits = ui->CboxStopBits->currentText();
//设置串口配置
//设置端口号
mSerialPort.setPortName(mPortName);
//设置波特率
if("9600" == mBaudRate)
{
mSerialPort.setBaudRate(QSerialPort::Baud9600);
}
else if("19200" == mBaudRate)
{
mSerialPort.setBaudRate(QSerialPort::Baud19200);
}
else
{
mSerialPort.setBaudRate(QSerialPort::Baud115200);
}
//设置校验位
if("NONE" == mParity)
{
mSerialPort.setParity(QSerialPort::NoParity);
}
else if("ODD" == mParity)
{
mSerialPort.setParity(QSerialPort::OddParity);
}
else
{
mSerialPort.setParity(QSerialPort::EvenParity);
}
//设置数据位
if("6" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data6);
}
else if("7" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data7);
}
else
{
mSerialPort.setDataBits(QSerialPort::Data8);
}
//设置停止位
if("1.5" == mStopBits)
{
mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
}
else if("2" == mStopBits)
{
mSerialPort.setStopBits(QSerialPort::TwoStop);
}
else
{
mSerialPort.setStopBits(QSerialPort::OneStop);
}
//打开串口
return mSerialPort.open(QSerialPort::ReadWrite);
}
串口打开_按钮使能控制
串口使能效果,当串口打开后,其串口号,波特率,校验位,数据位,停止位不能再被更改,除非关闭
//串口打开按钮
//ui界面的PushButton按钮右键转到槽点击后自动生成的函数框
void MainWindow::on_BtnOpen_clicked()
{
if(true == mIsOpen)
{
//当前串口助手打开后,执行关闭的动作
mSerialPort.close();
ui->BtnOpen->setText("打开");
mIsOpen = false;
ui->CboxSerialPort->setEnabled(true);
ui->CboxBaurdRate->setEnabled(true);
ui->CboxParity->setEnabled(true);
ui->CboxDateBits->setEnabled(true);
ui->CboxStopBits->setEnabled(true);
}
else
{
//当前串口助手没有打开串口,执行打开串口的动作
if(true == getSerialPortConfig())
{
mIsOpen = true;
ui->BtnOpen->setText("关闭");
qDebug() << "成功打开串口" << mPortName;
ui->BtnSend->setEnabled(mIsOpen);//串口成功打开,ui界面的发送button使能
ui->CboxSerialPort->setEnabled(false);
ui->CboxBaurdRate->setEnabled(false);
ui->CboxParity->setEnabled(false);
ui->CboxDateBits->setEnabled(false);
ui->CboxStopBits->setEnabled(false);
}
// else
// {
// mIsOpen = false;
// }
}
}
数据发送文本框配置
//发送文本框
//ui界面的PushButton按钮右键转到槽点击后自动生成的槽函数
void MainWindow::on_BtnSend_clicked()
{
if(true == mIsOpen)
{
//串口写入 ui发送文本框设置返回文本(QString类型),转换成标准C++String再转换成char*字符串指针,中文不支持
// mSerialPort.write(ui->TextSend->toPlainText().toStdString().c_str());
//更换成toPlainText().toLocal8Bit()既可以发送字符,数字,也可以发送中文
mSerialPort.write(ui->TextSend->toPlainText().toLocal8Bit());
}
}
数据接收文本框配置
//接收文本框
//在.h文件中子定义on_SerialPort_readyRead,鼠标选择键盘按住alt+enter自动生成槽函数
void MainWindow::on_SerialPort_readyRead()
{
if(true == mIsOpen)
{
QString sysTime;//定义系统时间变量
//接收槽 接收到信号内容并设置给ui界面的文本框
QByteArray recvData = mSerialPort.readAll();
QString Data = QString::fromLocal8Bit(recvData);//转换格式QString::fromLocal8Bit可以显示中文
//setPlainText()只能显示一次 insertPlainText()多次显示不换行 append()多次显示且换行
sysTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss\n");//换行使用\n即可
ui->TextReceive->append(sysTime + QString("接收: " + Data));//接收文本框显示数
}
}
清楚文本框按钮配置
//清除文本框按钮
//ui界面的清楚窗口按钮右键转到槽点击后自动生成的槽函数
void MainWindow::on_BtnClear_clicked()
{
ui->TextReceive->clear();
}
本文地址:https://blog.csdn.net/qq_40715266/article/details/107982284