QT——简单的串口调试助手实现

界面布局:
在这里插入图片描述
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    bool getPortInfo();      //设置串口信息,返回是否打开串口

private slots:
    void on_openButton_clicked();    //串口开关槽函数

    void on_sendButton_clicked();    //发送按钮槽函数

    void on_SerialPoirtReadyRead();    //串口接收数据槽函数

private:
    Ui::Widget *ui;

    bool buttonStatus;   //定义打开按钮状态
    QString m_PortName;  //定义端口名字
    QString m_Baudrate;  //定义波特率
    QString m_databit;   //定义数据位
    QString m_checkbit;  //定义校验位
    QString m_stop;      //定义停止位

    QSerialPort  m_serialPort;  //定义串口

};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QSerialPortInfo>
#include <QList>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    buttonStatus = false;
    ui->sendButton->setEnabled(false);   //当串口是关闭状态时发送按钮不能点击
    QList<QSerialPortInfo>ListPort =QSerialPortInfo::availablePorts();    //将可用的串口设置为List
    int cnt =ListPort.count();      //统计有多少个可用的串口
    for(int i = 0;i<cnt;i++){
        ui->portBox->addItem(ListPort.at(i).portName());    //将串口智能添加到portBox中
    }

    //接收区数据不能认为输入
    ui->receive->setEnabled(false);

    connect(&m_serialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPoirtReadyRead()));

    //清空接收区数据
    connect(ui->cleanreceive,&QPushButton::clicked,[=](){
        ui->receive->clear();
    });

    //清空发送区数据
    connect(ui->cleansend,&QPushButton::clicked,[=](){
       ui->send->clear();
    });
}

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

bool Widget::getPortInfo(){
    //获取串口配置
    m_PortName = ui->portBox->currentText();
    m_Baudrate = ui->baudBox->currentText();
    m_databit = ui->dataBit->currentText();
    m_checkbit = ui->checkBit->currentText();
    m_stop = ui->stopBit->currentText();

    //设置串口配置
    m_serialPort.setPortName(m_PortName); //设置串口

    if(m_Baudrate == "9600"){   //ui界面中波特率是字符串形式,所以要进行判断,然后在设置的时候设置成int形式
        m_serialPort.setBaudRate(9600);
    }else if(m_Baudrate == "19200"){
         m_serialPort.setBaudRate(19200);
    }else if(m_Baudrate == "115200"){
         m_serialPort.setBaudRate(115200);
    }

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

    if(m_checkbit == "None"){    //设置校验位
        m_serialPort.setParity(QSerialPort::NoParity);
    }else if(m_checkbit == "Odd"){
        m_serialPort.setParity(QSerialPort::OddParity);
    }else if(m_checkbit == "Even"){
        m_serialPort.setParity(QSerialPort::EvenParity);
    }

    if(m_stop == "1"){          //设置停止位
        m_serialPort.setStopBits(QSerialPort::OneStop);
    }else if(m_stop == "2"){
        m_serialPort.setStopBits(QSerialPort::TwoStop);
    }

    m_serialPort.open(QSerialPort::ReadWrite);
    return m_serialPort.isOpen();
}

void Widget::on_openButton_clicked()   //打开串口槽函数
{
        if(buttonStatus == true){      //串口助手处于打开状态时按下按钮
            m_serialPort.close();
            ui->openButton->setText("打开");
            buttonStatus = false;
            ui->baudBox->setEnabled(true);        //因为处于关闭状态所以将设置使能
            ui->dataBit->setEnabled(true);
            ui->portBox->setEnabled(true);
            ui->checkBit->setEnabled(true);
            ui->stopBit->setEnabled(true);
            ui->sendButton->setEnabled(false);
        }else{                         //串口助手处于关闭状态时按下按钮
            if(getPortInfo() == true){
                ui->openButton->setText("断开");
                buttonStatus = true;

                ui->baudBox->setEnabled(false);   //因为处于开启状态所以将设置失能
                ui->dataBit->setEnabled(false);
                ui->portBox->setEnabled(false);
                ui->checkBit->setEnabled(false);
                ui->stopBit->setEnabled(false);
                ui->sendButton->setEnabled(true);
            }else{
                buttonStatus = false;    //设置按钮状态为关闭
            }
        }
}

void Widget::on_sendButton_clicked()  //发送数据槽函数
{
    if(buttonStatus == true){     //当串口是打开状态
        m_serialPort.write(ui->send->toPlainText().toStdString().c_str());   //转换成字符串指针
    }

}

void Widget::on_SerialPoirtReadyRead()   //接收数据槽函数
{
    if(buttonStatus == true){     //当串口是打开状态
        QByteArray recvData = m_serialPort.readAll();
        ui->receive->append(QString(recvData));   //追加到之前的信息之后防止之前的信息被覆盖掉
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
与硬件通信的程序基本上要用到串口,虽然qt5以后集成了串口通信类,但是个人觉得那个串口通信类有点问题,在linux上表现很好,windows上大数据会有怪怪的问题出现,而且只能在qt5以上的版本才能用,无奈大部分的嵌入式linux上还停留在4.7.1到4.8.5左右的版本,所以本人一直喜欢用第三方的串口通信类做处理。 程序调试中经常需要串口调试,甚至还需要模拟设备数据回复,甚至串口转网络出去,特意将这些常用功能都做到一个串口调试助手中去。 基本功能: 1:支持16进制数据发送与接收。 2:支持windows下COM9以上的串口通信。 3:实时显示收发数据字节大小以及串口状态。 4:支持任意qt版本,亲测4.7.0 4.8.5 4.8.7 5.4.1 5.7.0 5.8.0。 5:支持串口转网络数据收发。 高级功能: 1:可自由管理需要发送的数据,每次只要从下拉框中选择数据即可,无需重新输入数据。 2:可模拟设备回复数据,需要在主界面开启模拟设备回复数据。当接收到设置好的指令时,立即回复设置的回复指令。例如指定收到0x16 0x00 0xFF 0x01需要回复0x16 0x00 0xFE 0x01,则只需要在SendData.txt中添加一条数据16 00 FF 01:16 00 FE 01即可。 3:可定时发送数据和保存数据到文本文件:,默认间隔5秒钟,可更改间隔时间。 4:在不断接收到大量数据时,可以暂停显示数据来查看具体数据,后台依然接收数据但不处理,无需关闭串口来查看已接收到的数据。 5:每次收到的数据都是完整的一条数据,而不是脱节的,做了延时处理。 6:一套源码随处编译,无需更改串口通信类,已在XP/WIN7/UBUNTU/ARMLINUX系统下成功编译并运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值