QT串口助手

串口助手

使用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还需优化,串口助手的功能还需拓展,应与真实单片机完成交互!!!

### QT串口助手使用教程 QT串口助手中的主要操作围绕着配置和管理串口通信展开。通过设置端口号、波特率以及其他参数,能够实现与不同设备之间的稳定连接[^1]。 对于初次使用者来说,在打开串口助手之后需先设定好目标串口的相关属性,比如将端口号指定为`COM2`并调整至合适的波特率等必要选项后保存设置;随后编译运行所准备的应用程序(快捷键Ctrl+B, Ctrl+R),此时应该可以在界面上观察到来自外部装置发送过来的数据流显示为“hello world”,这表明测试已经顺利完成[^2]。 当遇到具体问题时,建议按照如下几个方面排查: - **确认物理连接无误**:确保所有线缆都已正确接入对应的接口,并且电源供应正常。 - **验证驱动安装情况**:部分硬件可能需要额外安装特定版本的驱动才能被操作系统识别。 - **检查软件内部配置**:仔细核对应用内的各项参数是否匹配实际需求以及目标设备的要求。 ```cpp // C++代码示例展示如何初始化QSerialPort对象来建立连接 #include <QCoreApplication> #include <QSerialPort> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSerialPort serial; serial.setPortName("COM2"); // 设置端口号 serial.open(QIODevice::ReadWrite); // 尝试打开串口 if (!serial.isOpen()) { qDebug() << "Failed to open port"; return -1; } serial.write("Hello World\n"); serial.waitForBytesWritten(100); return a.exec(); } ``` #### 常见错误处理技巧 如果发现无法接收到预期的消息或者出现了异常提示,则可以从以下几个角度入手分析原因所在: - 若始终得不到回应,请尝试更换其他可用的COM端口; - 如果总是报告超时错误,考虑适当增加等待时间或是降低传输速率; - 对于乱码现象,重点审查字符编码方式的选择是否一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值