QT串口助手的实现

QT串口助手项目工程

serial.c

#include "serial.h"
#include "ui_serial.h"

serial::serial(QWidget *parent) : QWidget(parent),
                                  ui(new Ui::serial)
{
    ui->setupUi(this);
    system_init();
}

serial::~serial()
{
    delete timer;
    delete ui;
}
/***子函数代码区****/

//初始化控件
void serial::system_init()
{
    //自动搜索串口号
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
    // 禁止最大化按钮
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
    // 禁止拖动窗口大小
    setFixedSize(this->width(), this->height());
    //流控设置
    global_port.setFlowControl(QSerialPort::NoFlowControl);
    //按钮执行事件绑定  connect(信号发出者地址,发什么信号,在那个类触发,触发事件)
    //打开串口绑定
    connect(ui->btn_open, &QPushButton::clicked, this, &serial::btn_open);
    //搜索串口
    connect(ui->btn_search, &QPushButton::clicked, this, &serial::btn_search);
    //发送数据绑定
    connect(ui->btn_push, &QPushButton::clicked, this, &serial::btn_push_send);
    //接受数据
    connect(&global_port, &QSerialPort::readyRead, this, &serial::accept_date);
    //清除接受区域
    connect(ui->btn_del_accept, &QPushButton::clicked, this, &serial::del_Accept);
    //清除发送区域
    connect(ui->btn_del_push, &QPushButton::clicked, this, &serial::del_Send);
    //定时发送
    connect(ui->btn_tim_push, &QPushButton::clicked, this, &serial::timer_send);
    //停止发送
    connect(ui->btn_tim_off, &QPushButton::clicked, this, &serial::send_stop);
    //定时器
    connect(timer, SIGNAL(timeout()), this, SLOT(while_send()));
}
//串口信息配置函数
void serial::btn_open(bool)
{
    //打开串口
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    //先清除开始的串口信息
    ui->cmb_com->clear();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
    if (flag == 0 && count > 0)
    {
        flag = 1;
        //设置串口号
        QString Port_Name = ui->cmb_com->currentText();
        global_port.setPortName(Port_Name);
        //数据位宽
        switch (ui->cmb_date->currentIndex())
        {
        case 0:
            global_port.setDataBits(QSerialPort::Data8);
            break;
        case 1:
            global_port.setDataBits(QSerialPort::Data7);
            break;
        case 2:
            global_port.setDataBits(QSerialPort::Data6);
            break;
        default:
            global_port.setDataBits(QSerialPort::Data5);
            break;
        }
        //停止位
        switch (ui->cmb_stop->currentIndex())
        {
        case 0:
            global_port.setStopBits(QSerialPort::OneStop);
            break;
        case 1:
            global_port.setStopBits(QSerialPort::OneAndHalfStop);
            break;
        default:
            global_port.setStopBits(QSerialPort::TwoStop);
            break;
        }
        //奇偶校验
        switch (ui->cmb_parity->currentIndex())
        {
        case 0:
            global_port.setParity(QSerialPort::NoParity);
            break;
        case 1:
            global_port.setParity(QSerialPort::OddParity);
            break;
        default:
            global_port.setParity(QSerialPort::EvenParity);
            break;
        }
        //波特率
        switch (ui->cmb_bound->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::Baud9600);
            break;
        case 4:
            global_port.setBaudRate(QSerialPort::Baud2400);
            break;
        default:
            global_port.setBaudRate(QSerialPort::Baud1200);
            break;
        }

        global_port.open(QSerialPort::ReadWrite);
        ui->btn_open->setText("关闭串口");
        ui->lab_state->setText("串口已打开");
    }
    else if (flag == 0 && count <= 0)
    {
        QMessageBox::information(this, tr("Error"), QStringLiteral("没有搜索到串口"), QMessageBox::Ok);
    }
    else
    {
        global_port.close();
        ui->btn_open->setText("打开串口");
        ui->lab_state->setText("串口未打开");
        flag = 0;
    }
}
//搜索串口函数
void serial::btn_search(bool)
{

    //自动搜索串口号
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
    int count = serialPortInfo.count();
    //先清除开始的串口信息
    ui->cmb_com->clear();
    for (int i = 0; i < count; i++)
    {
        ui->cmb_com->addItem(serialPortInfo.at(i).portName());
    }
}
//数据发送函数
void serial::btn_push_send(bool)
{
    QString str = ui->lint_send->text();

    //    要能正确发送中文字符,需要使用QString的toLocal8Bit方法
    //    serial->write(str.toLatin1());

    global_port.write(str.toLocal8Bit());
    global_port.write("\r\n");
}

//数据接受函数
void serial::accept_date()
{
    QByteArray buf;
    QString res;

    buf = global_port.readAll();
    res = QString(buf);

    if (!buf.isEmpty())
    {
        // 调试输出buf大小
        //qDebug()<<buf.size()<<endl;

        // 将QByteArray数据类型转换,要能正确显示中文,需要使用QString::fromLocal8Bit
        //        QString str = QString::fromUtf8( buf );
        QString str = QString::fromLocal8Bit(buf);

        // 如果以16进制显示数据:
        if (ui->cbox_hex->isChecked())
        {
            QString hex_data = buf.toHex().data(); // 将buf里的数据转换为16进制
            hex_data = hex_data.toUpper();         // 转换为大写
            QString hex_str;
            // 将16进制转换为大写
            for (int i = 0; i < hex_data.length(); i += 2)
            {
                QString st = hex_data.mid(i, 2);
                hex_str += st;
                hex_str += ' ';
            }
            ui->lint_accept->insertPlainText(hex_str);
        }
        else
        {
            ui->lint_accept->insertPlainText(str);
        }
    }

    buf.clear();
}
//清除接受区域函数
void serial::del_Accept(bool)
{
    ui->lint_accept->clear();
}
//清除发送区域函数
void serial::del_Send(bool)
{
    ui->lint_send->clear();
}
//定时发送函数
void serial::timer_send(bool)
{
    //timerEvent();
    QString ms = ui->lint_ms->text();
    //qDebug()<< ms;
    //按钮可用控制

    timer->start(ms.toInt());
    ui->btn_tim_push->setEnabled(false);
    ui->btn_tim_off->setEnabled(true);
}
//停止发送函数
void serial::send_stop(bool)
{
    timer->stop();
    //按钮可用控制
    ui->btn_tim_push->setEnabled(true);
    ui->btn_tim_off->setEnabled(false);
}
//定时器函数
void serial::while_send()
{
    QString str = ui->lint_send->text();
    global_port.write(str.toLocal8Bit());
    global_port.write("\r\n");
}

/****end*********/

serial.h文件

/*
 * @Author: Stylle
 * @Date: 2020-07-19 21:21:46
 * @LastEditors: Stylle
 * @LastEditTime: 2020-07-22 10:42:47
 * @FilePath: \tool-mastar\stylle_toolV1.8\serial.h
 */
#ifndef SERIAL_H
#define SERIAL_H

#include <QWidget>

/*******user include**********/

//串口头
#include <QSerialPort>
#include <QSerialPortInfo>
//定时器
#include <QTimer>
//串口号数组
#include <QList>
//消息弹窗
#include <QMessageBox>
/***********end***************/

namespace Ui
{
    class serial;
}

class serial : public QWidget
{
    Q_OBJECT

public:
    explicit serial(QWidget *parent = 0);
    ~serial();

private slots:
    //打开串口按钮函数
    void btn_open(bool);
    //搜索串口按钮函数
    void btn_search(bool);
    //发送信息按钮函数
    void btn_push_send(bool);
    //接受数据
    void accept_date();
    //清除接受
    void del_Accept(bool);
    //清除发送
    void del_Send(bool);
    //定时发送
    void timer_send(bool);
    //停止发送
    void send_stop(bool);
    //定时执行函数
    void while_send();

private:
    Ui::serial *ui;
    /***funtion****/
    //声明子函数
    void system_init();

    /***variable***/
    //声明变量
    QSerialPort global_port;
    //定时器变量
    QTimer *timer = new QTimer(this);
    //打开按钮状态
    bool flag = 0;
};

#endif // SERIAL_H

需要注意的是.pro文件中需要在QT+=中加上serialport才能使用串口模块
成品展示
QT串口助手

猜你喜欢

转载自blog.csdn.net/qq_43581670/article/details/107714686