QT制作简易串口

QT 实现一个简易版串口调试助手

文章目录

 1. 设计 UI 界面

 2. 具体代码编写

 3. 最终实现效果图

一、设计 UI 界面

 设计 UI 界面之前,让我们先看一下别人设计的串口助手大概长什么样子,具体有哪些功能。

 我们发现串口调试助手的主要功能就是发现串口,打开串口,接受数据和发送数据。

 至此,我们可以开始具体的 UI 设计了。

  1. 打开 ui 文件(默认情况下为 mainwindow.ui)

  2. 首先 需要发现串口,打开串口,也就是说我们需要 设计 端口,波特率,校验位,数据位,停止位的下拉框 和 一个打开串口的按钮。

  由于串口号,一般来说都是自动检测的,所以我们在这不给出默认值,波特率的话太多了,也不给出默认值。

 检验位的话一般为:NONE,ODD,EVEN,MARK,SPACE

  数据位一般设置为:8,5,6,7(一般情况下使用 8 为数据位,8放在第一个比较好看)

  停止位一般设置为:1,1.5,2(默认为 1)

  大概设计界面如下:



3. 接受数据和发送数据也各自需要一个 文本编辑 类型的框。

    大概设计如下:

注意:每个要使用的 组件需要给它们定义一个 objectName (这样子方便我们后续在代码中用到这个相关组件)

  例如:

二、具体代码编写

首先,我们需要引入 串口 模块

 ​ 在 .pro 文件中第一行 QT += core gui

 ​ 在后面加一个 serialport

QT       += core gui serialport
  1. 首先需要检测串口

  我们需要先引入下方两个QT提供的对串口操作头文件,方便后续对串口进行操作。

#include "QSerialPort"
#include "QSerialPortInfo"

​  右键点击检测串口 ,再点击转到槽,最后点击 clicked() 即可。

 经过上述步骤后,我们就得到了一个 按钮 点击的信号和槽函数。

 OK,我们继续,由于我们只需要获取到 串口号 和 波特率(其实只需要串口号,波特率只是为了偷懒)

  • 先清空串口号
  • 查找串口号,使用 foreach 函数 将 可用的串口信息类 一个一个赋值给 info
  • 将 串口信息类 中的 串口号 一个一个赋值给我们设置的 串口下拉框
  • 波特率的话就比较简单了,只需要将标准波特率返回到一个 list 数组中即可
  • 由于 返回的 波特率 为 qint32( signed int ) 的类型,我们需要将其转化为 QString 类型
void MainWindow::on_testSerial_clicked()
{
    ui->numSerial->clear();				
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //把后面每个项 依次赋值给 info
    {
        ui->numSerial->addItem(info.portName());
     }
      QList<int> baudList=QSerialPortInfo::standardBaudRates();
      for(int i=0;i<baudList.length();i++){
          char str[20];
          int length;
          int2Chars(str,baudList.at(i),length);
          ui->baudSerial->addItem(QString(QByteArray(str,length )));
      }
      ui->openSerial->setEnabled(true);//使能打开串口
}

//编写一个函数 使得 qint32 转化为 QString ,大概思路为 创建一个临时变量 temp,对 10 求余获取到个位,再加上 '0' 的 ascall码,最后使 a/10 ,进行倒数第二个数值的获取
//最后由于上面是先从个位取值,所以反向 赋值即可
void MainWindow::int2Chars(char str[],long long int a,int &length){
    length=0;
    char temp[20];
    while(a){
        temp[length]='0'+a%10;
        a=a/10;
        length++;
    }
    str[length]=0;
    int i,j;
    i=0;j=length-1;
    for(;i<length;i++,j--){
        str[i]=temp[j];
    }
    return;
}
  1. 打开串口

    • 初始化为 打开串口的 文本名字为 打开串口

    • 判断 按钮文本是否为 打开串口,是的话设置对应的数值,否的话关闭串口,设置打开串口按钮使能 false

    • 点击打开串口,设置 串口号为当前的 文本数值,波特率为 当前的 文本数值再转化为 Int 数值

    • 至于剩下的我们有给出默认值的下拉框,我们可以设置 为下标(currentIndex) 为固定的 串口信息的值。例如第一个 检验位,第一个为 NONE ,我们就设置 串口 检验位 Parity 为QSerialPort::NoParity(需要去查询 qt助手 获取)

void MainWindow::on_openSerial_clicked()
{
    if(ui->openSerial->text() == QString("打开串口"))//判断是否是打开串口
    {
        serial.setPortName(ui->numSerial->currentText());
        serial.setBaudRate(ui->baudSerial->currentText().toInt());

        switch (ui->checkSerial->currentIndex()) {

            case 0:
                serial.setParity(QSerialPort::NoParity);
                break;
            case 1:
                serial.setParity(QSerialPort::OddParity);
                break;
            case 2:
                serial.setParity(QSerialPort::EvenParity);
                break;
            case 3:
                serial.setParity(QSerialPort::MarkParity);
                break;
            case 4:
                serial.setParity(QSerialPort::SpaceParity);
                break;
            default:
                break;
        }

        switch (ui->dataSerial->currentText().toInt()) {
            case 5:
                serial.setDataBits(QSerialPort::Data5);
            break;
            case 6:
                serial.setDataBits(QSerialPort::Data6);
            break;
            case 7:
                serial.setDataBits(QSerialPort::Data7);
            break;
            case 8:
                serial.setDataBits(QSerialPort::Data8);
            break;

        default:
            break;
        }

        switch (ui->dataSerial->currentIndex()) {
            case 0:
                serial.setStopBits(QSerialPort::OneStop);
            break;
            case 1:
                serial.setStopBits(QSerialPort::OneAndHalfStop);
            break;
            case 2:
                serial.setStopBits(QSerialPort::TwoStop);
            break;

        default:
            break;
        }

        if(serial.open(QIODevice::ReadWrite))
        {
            QMessageBox::about(NULL, "提示", "打开串口成功");
            ui->openSerial->setText("关闭串口");
            ui->openLight->setEnabled(true);
            ui->closeLight->setEnabled(true);

            ui->testSerial->setEnabled(false);

            ui->numSerial->setEnabled(false);
            ui->checkSerial->setEnabled(false);
            ui->baudSerial->setEnabled(false);
            ui->dataSerial->setEnabled(false);
            ui->stopSerial->setEnabled(false);

        }else{
            QMessageBox::about(NULL, "提示", "打开串口失败");
        }
    }else{
        serial.close();
        ui->openLight->setEnabled(false);
        ui->closeLight->setEnabled(false);
        ui->openSerial->setText("打开串口");
        ui->openSerial->setEnabled(false);
        ui->testSerial->setEnabled(true);

        ui->numSerial->setEnabled(true);
        ui->checkSerial->setEnabled(true);
        ui->baudSerial->setEnabled(true);
        ui->dataSerial->setEnabled(true);
        ui->stopSerial->setEnabled(true);
    }
}
  1. 发送和接受数据

    3.1 接受数据

    由于QT显示为 UTF8 ,windows显示为 GBK,需要切换

    void MainWindow::on_readSerial()
    {
        QByteArray buffer = serial.readAll();//串口接受数据
        QString Buf = QString::fromLocal8Bit(buffer);//设置成 可以从中文GBK 变成 utf8
        ui->recvTextEdit->clear();// 清空显示
        ui->recvTextEdit->setText(Buf);//显示
    }
    

    3.2 发送数据

    void MainWindow::on_sendButton_clicked()
    {
    	//获取数据,更改为 local8Bit 可以显示中文
        QByteArray data = ui->sendTextEdit->toPlainText().toLocal8Bit();
        serial.write(data);
    
    }
    
    

最终实现效果图

最后

​ 我们这个简易的串口调试助手就做好了。若有什么问题,可以评论区评论,一起讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿轩雪灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值