QT开发——简易串口助手

1、前言

本串口助手实现的功能能实现简易的收发。

效果如图所示:

2、代码:

1.首先在.pro文件内引上:

QT       += core gui serialport 

2.其次.h文件为:

#ifndef WAVE_2_H
#define WAVE_2_H

#include <QMainWindow>

//提示
#include <QMessageBox>

//串口
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

//QString
#include <QString>
//QDateTime
#include <QDateTime>
//QTimer
#include <QtCore/QTimer>

#include <QFile>
#include <QFileDialog>
#include <QToolBar>


QT_BEGIN_NAMESPACE

namespace Ui { class WAVE_2; }

QT_END_NAMESPACE

class WAVE_2 : public QMainWindow
{
    Q_OBJECT

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


public:
    bool getSerialPortConfig(void);

private slots:
    void on_ON_Button_clicked();

    void on_Send_data_Button_clicked();

    void on_ClearGet_Button_clicked();

    void on_ClearSend_Button_clicked();

    void on_SerialPort_readyRead();

    void on_OFF_Button_clicked();

private:
    Ui::WAVE_2 *ui;


private:
    //字符串转16进制
    QByteArray QString2Hex(QString str);
    //字符转16进制
    char ConvertHexChar(char ch);

    bool mIsopen;
    QSerialPort mSerialPort;   //串口对象
    QString mPortName ;
    QString mBaudRate;
    QString mParity;
    QString mDataBits;
    QString mStopBits;

};


#endif // WAVE_2_H

3.其次.cpp文件为:

#include "wave_2.h"
#include "qserialport.h"
#include "ui_wave_2.h"

WAVE_2::WAVE_2(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::WAVE_2)
{
    QStringList serialNamePort;

    ui->setupUi(this);
    this->setWindowTitle("蒂蒂的百宝箱");

    /* 搜索所有可用串口 */
    foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {
        serialNamePort<<inf0.portName();
    }
    ui->serial_Box->addItems(serialNamePort);
    connect(&mSerialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPort_readyRead()));
}

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

bool WAVE_2::getSerialPortConfig()//串口配置
{

     mPortName = ui->serial_Box->currentText();
     mBaudRate = ui->baudrate_Box->currentText();
     mParity = ui->checkbit_Box->currentText();
     mDataBits = ui->databit_Box->currentText();
     mStopBits = ui->stopbit_Box->currentText();

    //设置串口配置
     mSerialPort.setPortName(mPortName);
     if("9600" == mBaudRate)
     {
        mSerialPort.setBaudRate(QSerialPort::Baud9600);
     }
     else if("115200" == mBaudRate)
     {
        mSerialPort.setBaudRate(QSerialPort::Baud115200);
     }

    //校验位
     if("EVEN" == mParity)
        {
        mSerialPort.setParity(QSerialPort::EvenParity);

        }
     else if("ODD" == mParity)
     {
        mSerialPort.setParity(QSerialPort::OddParity);

     }
     else if("NONE" == mParity)
        {
        mSerialPort.setParity(QSerialPort::NoParity);
        }

     //数据位
        if("5" == mDataBits)
        {
        mSerialPort.setDataBits(QSerialPort::Data5);
        }
       else if("6" == mDataBits)
        {
        mSerialPort.setDataBits(QSerialPort::Data6);
        }
       else if("7" == mDataBits)
        {
        mSerialPort.setDataBits(QSerialPort::Data7);
        }
       else if("8" == mDataBits)
        {
        mSerialPort.setDataBits(QSerialPort::Data8);
        }

        //停止位
        if("1.5" == mStopBits)
        {
        mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
        }
       else if("2" == mStopBits)
        {
        mSerialPort.setStopBits(QSerialPort::TwoStop);
        }
       else if("1" == mStopBits)
        {
        mSerialPort.setStopBits(QSerialPort::OneStop);
        }

        //打开串口,读写模式
        return mSerialPort.open(QSerialPort::ReadWrite);
}

void WAVE_2::on_ON_Button_clicked()
{

        if(true == getSerialPortConfig())
        {
            mIsopen = true;
            QMessageBox::information(this, "蒂蒂温馨提示", "串口已经打开");
            ui->Send_data_Button->setEnabled(mIsopen);//串口成功打开,ui界面的发送button使能
        }
}

void WAVE_2::on_Send_data_Button_clicked()
{

       if(true == mIsopen)
       {

        //串口写入 ui发送文本框设置返回文本(QString类型),转换成标准C++String再转换成char*字符串指针,中文不支持
        // mSerialPort.write(ui->TextSend->toPlainText().toStdString().c_str());

        //更换成toPlainText().toLocal8Bit()既可以发送字符,数字,也可以发送中文
        mSerialPort.write(ui->Send_Text->toPlainText().toLocal8Bit());
        }
}

void WAVE_2::on_ClearGet_Button_clicked()
{
        ui->receice_Text->clear();
}

void WAVE_2::on_ClearSend_Button_clicked()
{
        ui->Send_Text->clear();
}

void WAVE_2::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->receice_Text->append(sysTime + QString("接收: " + Data));//接收文本框显示数
        }
}

//字符转16进制
char WAVE_2::ConvertHexChar(char ch)
{
        if((ch >= '0') && (ch <= '9'))
        return ch-0x30;
        else if((ch >= 'A') && (ch <= 'F'))
        return ch-'A'+10;
        else if((ch >= 'a') && (ch <= 'f'))
        return ch-'a'+10;
        else return (-1);
}

//字符串转16进制
QByteArray WAVE_2::QString2Hex(QString str)
{
        QByteArray senddata;
        int hexdata,lowhexdata;
        int hexdatalen = 0;
        int len = str.length();
        senddata.resize(len/2);
        char lstr,hstr;

        for(int i=0; i<len; )
        {
        hstr=str[i].toLatin1();
        if(hstr == ' ')
        {
            i++;
            continue;
        }
        i++;
        if(i >= len)
            break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata == 16) || (lowhexdata == 16))
            break;
        else
            hexdata = hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
        }
        senddata.resize(hexdatalen);
        return senddata;
}

void WAVE_2::on_OFF_Button_clicked()
{
      mSerialPort.close();
      QMessageBox::information(this, "蒂蒂温馨提示", "串口已经关闭");
}

4.所需要的组件为:

QComboBox:5个——作为串口号、波特率、数据位、停止位以及检验位的选择设定。

QPushButton:5个——作为开关按钮、清空接收与发送框按钮以及最后的发送按钮。

相应的操作为:右键点击控件>转到槽>即可自动得到槽函数进行编辑。

QTextBrowser:1个——作为接收框,呈现接收数据文本。

QTextEdit:1个——作为发送框,编辑输出文本。

3、最后

超级简单的一份制作,简单看代码就能明白过来,当然,要继续做更多功能的串口助手可以继续往下做下去。满足自己的需要就好,也当练手。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值