使用QT简单写一个串口助手

作者:Jack_G
时间:2021.10.12
版本:V1.0
上次修改时间:无
批注:自动获取com口

①在工程文件中添加支持包,(官方支持,没有的话使用官方的管理工具添加即可)

QT       += serialport

在.h中添加串口相关的支持包

#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息

②然后再UI界面添加控件

注意命名方式,按照易理解的方式命名,以便于以后写代码不混乱,作者在这里用layout进行约束,添加了最基础的功能控件,日历控件准备后期换成chart来画波形图
在这里插入图片描述

③自动获取串口号函数

comboBox_Serial为串口号的comboBox

void MainWindow::on_pushButton__Port_Search_clicked()
{
    ui->comboBox_Serial->clear();// 清除以前的串口信息
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->comboBox_Serial->addItem(info.portName());
    }
}

④波特率函数

在ui对象构造函数里添加一些基本设置
comboBox_Baud_rate为作者创建的端口号的 comboBox,这里只写了几个常用的,还有一个自定义的

  // 初始化
    ui->comboBox_Baud_rate->insertItem(0, "9600");
    ui->comboBox_Baud_rate->insertItem(1, "115200");
    ui->comboBox_Baud_rate->insertItem(2, "3000000");
    ui->comboBox_Baud_rate->insertItem(3, "自定义");
    ui->comboBox_Baud_rate->setCurrentIndex(1);
    ui->pushButton_send->setDisabled(true);

自定义部分:
创建一个comboBox波特率的currentIndexChanged槽函数,代码如下
其中serial是后面添加的类成员

void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{

    if(this->ui->comboBox_Baud_rate->currentIndex() == 3)
    {
        this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入
        this->ui->comboBox_Baud_rate->setEditable(true);
    }
    else
    {
        this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入
        this->ui->comboBox_Baud_rate->setEditable(false);
    }
    serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}

⑤连接串口

再在private添加串口serial成员

QSerialPort serial;

如图
csdnimg.cn/9259b2f997494d3a86a03bbfa4baeef9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6IK_5LmI6ZiU5Lul5qyh5YWU5YWU,size_14,color_FFFFFF,t_70,g_se,x_16)

连接按钮的callback函数

void MainWindow::on_pushButton__Port_connect_clicked()
{
    if(this->ui->pushButton__Port_connect->text() == "连接")
    {
        serial.setPortName(ui->comboBox_Serial->currentText());
        serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
        serial.setDataBits(QSerialPort::Data8);     //设置串口数据位8
        serial.setParity(QSerialPort::NoParity);    //无校验位
        serial.setStopBits(QSerialPort::OneStop);   //1位停止位
        serial.setFlowControl(QSerialPort::NoFlowControl);
        if(!serial.open(QIODevice::ReadWrite))
        {
            QMessageBox::critical(NULL, "提示", "串口打开失败");
            return;
        }
        qDebug() << "串口打开成功";
        this->ui->pushButton__Port_connect->setText("关闭");
        this->ui->pushButton_send->setEnabled(true);
        this->ui->pushButton__Port_Search->setDisabled(true);
    }
    else
    {
        serial.close();
        this->ui->pushButton__Port_connect->setText("连接");
        this->ui->pushButton_send->setDisabled(true);
        this->ui->pushButton__Port_Search->setEnabled(true);
    }
}

⑥数据显示

在private slots:中添加一个操函数,

void serialPort_readyRead();        //connect连接方式,串口接收的数据进行处理

然后再构造函数中进行绑定

connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);

csdnimg.cn/9259b2f997494d3a86a03bbfa4baeef9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6IK_5LmI6ZiU5Lul5qyh5YWU5YWU,size_14,color_FFFFFF,t_70,g_se,x_16)

在这里插入图片描述
收到信息后的call波函数

void MainWindow::serialPort_readyRead()
{
    QByteArray rx_buf= serial.readAll();;
    QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf);    //转换为中文格式
    ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加
    rx_buf_tmp.clear();
    rx_buf.clear();
}

然后添加cursorPositionChanged函数来实现滚动显示

void MainWindow::on_textEdit_receive_cursorPositionChanged()
{
        ui->textEdit_receive->moveCursor(QTextCursor::End);
}

最后完成的代码如下

main.c

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.c

#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);

    // 初始化
    on_pushButton__Port_Search_clicked();
    ui->comboBox_Baud_rate->insertItem(0, "9600");
    ui->comboBox_Baud_rate->insertItem(1, "115200");
    ui->comboBox_Baud_rate->insertItem(2, "3000000");
    ui->comboBox_Baud_rate->insertItem(3, "自定义");
    ui->comboBox_Baud_rate->setCurrentIndex(1);
    ui->pushButton_send->setDisabled(true);


}

MainWindow::~MainWindow()
{
    delete ui;
}

// 搜索串口
void MainWindow::on_pushButton__Port_Search_clicked()
{
    ui->comboBox_Serial->clear();// 清除以前的串口信息
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->comboBox_Serial->addItem(info.portName());
    }
}

// 连接串口
void MainWindow::on_pushButton__Port_connect_clicked()
{
    if(this->ui->pushButton__Port_connect->text() == "连接")
    {
        serial.setPortName(ui->comboBox_Serial->currentText());
        serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
        serial.setDataBits(QSerialPort::Data8);     //设置串口数据位8
        serial.setParity(QSerialPort::NoParity);    //无校验位
        serial.setStopBits(QSerialPort::OneStop);   //1位停止位
        serial.setFlowControl(QSerialPort::NoFlowControl);
        if(!serial.open(QIODevice::ReadWrite))
        {
            QMessageBox::critical(NULL, "提示", "串口打开失败");
            return;
        }
        qDebug() << "串口打开成功";
        this->ui->pushButton__Port_connect->setText("关闭");
        this->ui->pushButton_send->setEnabled(true);
        this->ui->pushButton__Port_Search->setDisabled(true);
    }
    else
    {
        serial.close();
        this->ui->pushButton__Port_connect->setText("连接");
        this->ui->pushButton_send->setDisabled(true);
        this->ui->pushButton__Port_Search->setEnabled(true);

    }

}
void MainWindow::serialPort_readyRead()
{
    QByteArray rx_buf= serial.readAll();;
    QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf);    //转换为中文格式
    ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加
    rx_buf_tmp.clear();
    rx_buf.clear();
}

void MainWindow::on_pushButton_clean_clicked()
{
    ui->textEdit_receive->clear();
}


void MainWindow::on_pushButton_send_clicked()
{
    QString tx_buf = ui->textEdit_send->toPlainText();  //文本输入框的内容
    //获取多行输入框的数据并转换为UTF8格式
    QByteArray tx_buf_tmp = tx_buf.toLocal8Bit();   //转换为标准字符,支持中文

    if(ui->checkBox_Return->isChecked())
    tx_buf_tmp += "\r";
    if(ui->checkBox_New_Line->isChecked())
    tx_buf_tmp += "\n";
    qDebug()<<tx_buf_tmp;

    serial.write(tx_buf_tmp);     //把数据通过串口发送出去
    tx_buf.clear();
}


void MainWindow::on_textEdit_receive_cursorPositionChanged()
{
        ui->textEdit_receive->moveCursor(QTextCursor::End);
}



void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{

    if(this->ui->comboBox_Baud_rate->currentIndex() == 3)
    {
        this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入
        this->ui->comboBox_Baud_rate->setEditable(true);
    }
    else
    {
        this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入
        this->ui->comboBox_Baud_rate->setEditable(false);
    }
    serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include <QMessageBox>
#include <QDebug>

#include <QDir>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton__Port_Search_clicked();
    void on_pushButton__Port_connect_clicked();
    void serialPort_readyRead();        //connect连接方式,串口接收的数据进行处理
    void on_pushButton_clean_clicked();
    void on_pushButton_send_clicked();
    void on_textEdit_receive_cursorPositionChanged();
    void on_comboBox_Baud_rate_currentIndexChanged(int index);

private:
    Ui::MainWindow *ui;
    QSerialPort serial;
};
#endif // MAINWINDOW_H

测试截图
在这里插入图片描述

代码工程以及release下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值