Qt串口助手开发

Qt串口助手

  • ui设计图

串口助手ui

  • 效果
    在这里插入图片描述
代码实现
/****MySerialPort3.h****/
#ifndef MYSERIALPORT3_H
#define MYSERIALPORT3_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>


namespace Ui {
class MySerialPort3;
}

class MySerialPort3 : public QMainWindow
{
    Q_OBJECT

public:
    explicit MySerialPort3(QWidget *parent = nullptr);
    ~MySerialPort3();

    void serialInit();
    void baudRateInit();
    void dataBitsInit();
    void stopBitsInit();
    void parityInit();
    void flowControlInit();

private slots:
    void on_btnClearRecv_clicked();

    void on_btnClearSend_clicked();

    void on_btnSend_clicked();
    void on_readyRead();

    void on_btnSwitch_clicked();

private:
    Ui::MySerialPort3 *ui;

    QSerialPort *serialPort;
    QSerialPortInfo *serialPortInfo;
};

#endif // MYSERIALPORT3_H

/****MySerialPort3.cpp**/
#include "mySerialPort3.h"
#include "ui_mySerialPort3.h"

#include <QMessageBox>
#include <QDebug>

MySerialPort3::MySerialPort3(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MySerialPort3)
{
    ui->setupUi(this);


      serialInit();
      baudRateInit();
      dataBitsInit();
      stopBitsInit();
       parityInit();
       flowControlInit();
       connect(serialPort,&QSerialPort::readyRead,this,&MySerialPort3::on_readyRead);
}

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

//扫描串口
void MySerialPort3::serialInit()
{
    serialPort = new QSerialPort(this);
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
        ui->cmbChooseSerial->addItem(info.portName());
    }
}

//波特率初始化
void MySerialPort3::baudRateInit()
{
    QStringList strList;
    strList<<"9600"<<"115200";
    ui->cmbBaudRate->addItems(strList);
}

//数据位
  void MySerialPort3::dataBitsInit()
  {
      QStringList strList;
      strList<<"5"<<"6"<<"7"<<"8";
      ui->cmbDataBits->addItems(strList);
  }

  //停止位
 void MySerialPort3:: stopBitsInit()
 {
     QStringList strList;
     strList<<"1"<<"2";
     ui->cmbStopBits->addItems(strList);
 }

 //校验位
void MySerialPort3::parityInit()
{
    ui->cmbParity->addItem(QString::number(QSerialPort::NoParity));
    ui->cmbParity->addItem(QString::number(QSerialPort::OddParity));
    ui->cmbParity->addItem(QString::number(QSerialPort::EvenParity));
    ui->cmbParity->addItem(QString::number(QSerialPort::MarkParity));
}

void MySerialPort3::flowControlInit()
{
    ui->cmbFlowControl->addItem(QString::number(QSerialPort::NoFlowControl));
}

void MySerialPort3::on_btnClearRecv_clicked()
{
    ui->textEditRecv->clear();
}

void MySerialPort3::on_btnClearSend_clicked()
{
    ui->textEditSend->clear();
}

//打开串口的情况下才发送
void MySerialPort3::on_btnSend_clicked()
{
    if(!serialPort->isOpen()){
        QMessageBox::critical(this,"串口","串口未打开",QMessageBox::Ok);
        return;
    }

    //读取发送框中内容并发送
    //serialPort->write(ui->textEditSend->toPlainText().toUtf8().data());//不能发送中文
      serialPort->write(ui->textEditSend->toPlainText().toLocal8Bit());//可以发送中文
    ui->textEditSend->clear();

}

void MySerialPort3::on_readyRead()
{
    if(!serialPort->isOpen()){
        QMessageBox::critical(this,"串口","串口未打开",QMessageBox::Ok);
        return;
    }
    QByteArray arry = serialPort->readAll();

   // ui->textEditRecv->append(QString(arry.data()));//不能接收中文
    //ui->textEditRecv->append(QString(arry));//不能接收中文
  
 ui->textEditRecv->append(QString::fromLocal8Bit(arry));//可以接收中文
}

void MySerialPort3::on_btnSwitch_clicked()
{
    if(ui->btnSwitch->text() == "打开串口"){
        //设置串口
        serialPort->setPortName(ui->cmbChooseSerial->currentText());
        //设置波特率
        switch (ui->cmbBaudRate->currentText().toInt()) {
        case 9600:
             serialPort->setBaudRate(QSerialPort::Baud9600);
            break;
        case 115200:
            serialPort->setBaudRate(QSerialPort::Baud115200);
            break;
        default:
            break;
        }

        //设置数据位
        switch (ui->cmbDataBits->currentText().toInt()) {
        case 5:
            serialPort->setDataBits(QSerialPort::Data5);
            break;
        case 6:
            serialPort->setDataBits(QSerialPort::Data6);
            break;
        case 7:
            serialPort->setDataBits(QSerialPort::Data7);
            break;
        case 8:
            serialPort->setDataBits(QSerialPort::Data8);
            break;
        default:
            break;
        }
        //设置停止位
        switch (ui->cmbStopBits->currentText().toInt()) {
        case 1:
            serialPort->setStopBits(QSerialPort::OneStop);
            break;
        case 2:
            serialPort->setStopBits(QSerialPort::TwoStop);
            break;
        default:
            break;

        }

        //设置校验位
        if(ui->cmbParity->currentText() == QString(QSerialPort::OddParity))
            serialPort->setParity(QSerialPort::OddParity);
        else if(ui->cmbParity->currentText() == QString(QSerialPort::EvenParity))
            serialPort->setParity(QSerialPort::EvenParity);
        else if(ui->cmbParity->currentText() == QString(QSerialPort::MarkParity))
            serialPort->setParity(QSerialPort::MarkParity);
        //设置流控制位
        serialPort->setFlowControl(QSerialPort::NoFlowControl);

       bool isOpen =  serialPort->open(QIODevice::ReadWrite);
       if(!isOpen)
           QMessageBox::critical(this,"critical","串口打开失败",QMessageBox::Ok);

       ui->btnSwitch->setText(QString("关闭串口"));
       ui->cmbChooseSerial->setEnabled(false);
       ui->cmbBaudRate->setEnabled(false);
       ui->cmbDataBits->setEnabled(false);
       ui->cmbStopBits->setEnabled(false);
       ui->cmbParity->setEnabled(false);
       ui->cmbFlowControl->setEnabled(false);

    }else{
        serialPort->close();

        ui->btnSwitch->setText(QString("打开串口"));
        ui->cmbChooseSerial->setEnabled(true);
        ui->cmbBaudRate->setEnabled(true);
        ui->cmbDataBits->setEnabled(true);
        ui->cmbStopBits->setEnabled(true);
        ui->cmbParity->setEnabled(true);
        ui->cmbFlowControl->setEnabled(true);
    }
}

/*******main.cpp***************/
#include "mainwindow.h"
#include <QApplication>

#include "mySerialPort1.h"
#include "mySerialPort2.h"
#include "mySerialPort3.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    MySerialPort3 serialPort3;
    serialPort3.show();

    return a.exec();
}

注意:实验所用到的串口是虚拟串口,虚拟串口使用的软件为“ Virtual Serial Port Driver 6.9 ”。
虚拟串口软件截图:
在这里插入图片描述
在使用添加串口之后电脑的"设备管理器"中会看到虚拟出来的串口。
电脑中虚拟出来的串口如下:
在这里插入图片描述

展示
在这里插入图片描述

在这里插入图片描述
接收中文乱码,与发送中文乱码问题解决:

/**发送数据和接收数据的方法中修改为下面的两行代码即可解决*/
serialPort->write(ui->textEditSend->toPlainText().toLocal8Bit());//支持发送中文
 ui->textEditRecv->append(QString::fromLocal8Bit(arry));//支持接收中文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值