串口助手
使用qt制作的串口助手工具,参考教程b站视频
基本配置
- ui设计
- 控件命名规范
- 完成波特率,串口,奇偶校验等操作
- 代码实现逻辑与规范
ui 设计
ui基本草图如下:
主要控件是pushbutton
,combox
,label
等等,具体结构与命名规则见下:
真实ui如下:
代码逻辑
pro配置文件
在pro文件
里面添加
QT += core gui serialport(新加)
RC_ICONS = favicon.ico //图标设置
头文件h
- 添加相关库的头文件
- 自定义槽函数
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
/*-----------user-----------*/
//port
#include<QSerialPort>
//debug
#include<QDebug>
//port_info
#include<QSerialPortInfo>
//text_edit
#include<QPlainTextEdit>
//qstring
#include<QString>
//code
#include<QTextCodec>
/*-------------------------*/
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
//button
void btn_open_port(bool);
void btn_send_data(bool);
void btn_close_port(bool);
void btn_receive_modl_clicked();
void btn_send_modl_clicked();
void btn_send_clear();
void btn_receive_clear();
//receive_data
void receive_data();
//查找可用串口
void find_port();
private:
Ui::MainWindow *ui;
/*----------funtion-----------*/
void system_init();
void ui_init();
/*----------variable----------*/
QSerialPort global_port ;
bool textstate_receive = true;
bool textstate_send= true;
};
#endif // MAINWINDOW_H
执行文件cpp
注意代码规范!!!在该部分完成了槽函数的实现与调用!
代码量不多,但是封装的很好,可以多看看!!!
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//user
system_init();
}
MainWindow::~MainWindow()
{
delete ui;
}
/*-------------------------------------
* funtions
* -----------------------------------*/
void MainWindow::system_init(){
//port config
global_port.setParity(QSerialPort::NoParity);
global_port.setDataBits(QSerialPort::Data8);
global_port.setStopBits(QSerialPort::OneStop);
//connect
connect(ui->btn_open,&QPushButton::clicked,this,&MainWindow::btn_open_port);
connect(ui->btn_send_data,&QPushButton::clicked,this,&MainWindow::btn_send_data);
connect(&global_port,&QSerialPort::readyRead,this,&MainWindow::receive_data);
connect(ui->btn_close,&QPushButton::clicked,this,&MainWindow::btn_close_port);
connect(ui->btn_send_text,&QPushButton::clicked,this,&MainWindow::btn_send_modl_clicked);
connect(ui->btn_receive_text,&QPushButton::clicked,this,&MainWindow::btn_receive_modl_clicked);
connect(ui->btn_send_clear,&QPushButton::clicked,this,&MainWindow::btn_send_clear);
connect(ui->btn_receive_clear,&QPushButton::clicked,this,&MainWindow::btn_receive_clear);
//fix
this->setFixedSize( this->width (),this->height ());
//ui_init
ui_init();
}
/*------------------------------------
* slot
* ---------------------------------*/
void MainWindow::btn_open_port(bool){
//qDebug()<< ui->cmb_port_name->currentIndex();
/*--------------------open---------------------*/
global_port.open(QIODevice::ReadWrite);
/*----------------------port---------------*/
//find_port
find_port();
/*----------------baud_rate--------------------*/
switch (ui->cmb_baud_rate->currentIndex()) {
case 0 :
global_port.setBaudRate(QSerialPort::Baud115200);
break;
case 1 :
global_port.setBaudRate(QSerialPort::Baud57600);
break;
case 2 :
global_port.setBaudRate(QSerialPort::Baud38400);
break;
case 3 :
global_port.setBaudRate(QSerialPort::Baud19200);
break;
case 4 :
global_port.setBaudRate(QSerialPort::Baud9600);
break;
case 5 :
global_port.setBaudRate(QSerialPort::Baud4800);
break;
case 6 :
global_port.setBaudRate(QSerialPort::Baud2400);
break;
case 7 :
global_port.setBaudRate(QSerialPort::Baud1200);
break;
default:
global_port.setBaudRate(QSerialPort::Baud9600);
break;
}
/*------------------ui ----------------------*/
// 设置控件可否使用
ui->btn_send_data->setEnabled(true);
ui->btn_close->setEnabled(true);
ui->btn_open->setEnabled(false);
}
/*---------------sending data -------------------*/
void MainWindow::btn_send_data(bool){
if(textstate_send == true) //文版模式
{ QByteArray str = ui->send_text_window->toPlainText().toLatin1();
str.append("\r\n");
qDebug()<<str;
global_port.write(str);
}
if(textstate_send == false) //16进制
{
QString str = ui->send_text_window->toPlainText();
int num = str.toInt();
str = str.setNum(num,16);
ui->send_text_window->clear();
ui->send_text_window->insertPlainText(str);
global_port.write(ui->send_text_window->toPlainText().toLatin1());
}
}
/*------------------receive data -----------------*/
void MainWindow::receive_data(){
QByteArray buf;
buf = global_port.readAll();
if(!buf.isEmpty()) //将数据显示到文本串口
{
//qDebug()<<buf;
if(textstate_receive == true) //文本模式
{ //gbk编码
QTextCodec *tc = QTextCodec::codecForName("GBK");
QString str = tc->toUnicode(buf);
//qDebug()<<str;
ui->receive_text_window->insertPlainText(str);
// buf.clear();
}
if(textstate_receive == false) //hex模式
{
QString str = ui->receive_text_window->toPlainText();
// byteArray 转 16进制
QByteArray temp = buf.toHex();
str+=tr(temp);
str += " ";
ui->receive_text_window->insertPlainText(str);
qDebug()<<"hex模式";
}
}
buf.clear(); //清空缓存区
}
/*-----------------------close port----------------------*/
void MainWindow::btn_close_port(bool){
global_port.clear(); //清空缓存区
global_port.close(); //关闭串口
//ui
ui->btn_send_data->setEnabled(false);
ui->btn_open->setEnabled(true);
ui->btn_close->setEnabled(false);
}
/*----------------------find port -----------------------*/
void MainWindow::find_port()
{
//查找可用的串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
// QSerialPort serial;
global_port.setPort(info); //设置串口
if(global_port.open(QIODevice::ReadWrite))
{
qDebug()<<"test";
}
ui->cmb_port_name->addItem(global_port.portName()); //显示串口name
qDebug()<<"open_port";
}
}
/*------------------ui init ----------------------*/
void MainWindow::ui_init(){
ui->btn_send_data ->setEnabled(false);
ui->btn_close ->setEnabled(false);
this->setWindowTitle("个人串口助手");
//编码显示中文
char s[]="utf-8";
QTextCodec::setCodecForLocale(QTextCodec::codecForName(s));
}
/*----------------接收框文本模式转换-------------*/
void MainWindow::btn_receive_modl_clicked()
{
if(ui->btn_receive_text->text() == "文本模式")
{
textstate_receive = false;
ui->btn_receive_text->setText("hex模式");
}
else
{
ui->btn_receive_text->setText("文本模式");
textstate_receive = true;
}
}
/*------------------发送框文本转换------------------*/
void MainWindow::btn_send_modl_clicked()
{
if(ui->btn_send_text->text() == "文本模式")
{
textstate_send = false;
ui->btn_send_text->setText("hex模式");
}
else
{
ui->btn_send_text->setText("文本模式");
textstate_send = true;
}
}
/*---------------------clear---------------------------*/
void MainWindow::btn_send_clear(){
ui->send_text_window->clear();
}
void MainWindow::btn_receive_clear(){
ui->receive_text_window->clear();
}
小结
该程序的ui还需优化,串口助手的功能还需拓展,应与真实单片机完成交互!!!