QT学习——QT5串口编写的上位机

      最近自己学习了QT的相关知识和操作,但是却没有做过太多的QT项目,之前大多数都是通过MFC去实现一些功能项目,若用QT去实现同样的东西,其编程方法原理都是不会变的,加上觉得自己的指纹系统项目有点单一,所以准备基于QT5做一个串口编写的上位机,实现“软硬结合”。


      实现串口功能,需要我们主要处理好串口选择,波特率大小,停止位,校验位和串口的开闭操作。同时在接收和发送消息时我们可以将数据转换成自己想要的类型。


      下面是实现的代码:

       mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;

private slots:

    void ClearButton_onclick();    //清空接收按钮槽函数
    void SendButton_onclick();     //发送数据按钮槽函数
    void OpenButton_onclick();     //打开文件按钮槽函数
    void Read_Data();              //读取数据槽函数
};

#endif // MAINWINDOW_H


      mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

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

    //查找可用的串口
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort myserial ;  //串口类对象
        myserial.setPort(info);
        if(myserial.open(QIODevice::ReadWrite))
        {
            ui->portcomboBox->addItem(myserial.portName());  //添加串口号名字
            myserial.close();
        }
    }
    //设置波特率下拉菜单默认显示第六项
    ui->baoudcomboBox->setCurrentIndex(5);

    //关闭发送串口按钮的使能
    ui->SendDataButton->setEnabled(false);
    //QDebug()<<tr("界面设定成功!");

    QObject::connect(ui->ClearButton,SIGNAL(clicked()),this,SLOT(ClearButton_onclick()));
    QObject::connect(ui->OpenButton,SIGNAL(clicked()),this,SLOT(OpenButton_onclick()));
    QObject::connect(ui->SendDataButton,SIGNAL(clicked()),this,SLOT(SendButton_onclick()));

}


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


void MainWindow::ClearButton_onclick()    //清除接收功能函数
{
    ui->textEdit->clear();
}


void MainWindow::SendButton_onclick()     //发送数据功能函数
{
    serial->write(ui->textEdit_2->toPlainText().toLatin1()) ;  //按十六进制编码接入文本
}

void MainWindow::OpenButton_onclick()     //打开串口功能函数
{
    if(ui->OpenButton->text()==tr("打开串口"))
    {
        serial = new QSerialPort;

        serial->setPortName(ui->portcomboBox->currentText());   //设置串口名

        serial->open(QIODevice::ReadWrite);   //打开串口

        serial->setBaudRate(ui->baoudcomboBox->currentText().toInt());    //设置波特率

        switch(ui->datacomboBox->currentIndex())   //设置数据位数
        {
            case 8: serial->setDataBits(QSerialPort::Data8); break;
            default: break;
        }

        switch(ui->checkcomboBox->currentIndex())   //设置奇偶校验
        {
            case 0: serial->setParity(QSerialPort::NoParity); break;
            default: break;
        }
        //设置停止位
        switch(ui->stopcomboBox->currentIndex())
        {
            case 1: serial->setStopBits(QSerialPort::OneStop); break;
            case 2: serial->setStopBits(QSerialPort::TwoStop); break;
            default: break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);

        //关闭设置菜单使能
        ui->portcomboBox->setEnabled(false);
        ui->baoudcomboBox->setEnabled(false);
        ui->datacomboBox->setEnabled(false);
        ui->checkcomboBox->setEnabled(false);
        ui->stopcomboBox->setEnabled(false);
        ui->OpenButton->setText(tr("关闭串口"));
        ui->SendDataButton->setEnabled(true);

        //连接信号槽
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
    }
    else
    {
        //关闭串口
        serial->clear();
        serial->close();
        serial->deleteLater();

        //恢复设置使能
        ui->portcomboBox->setEnabled(true);
        ui->baoudcomboBox->setEnabled(true);
        ui->datacomboBox->setEnabled(true);
        ui->checkcomboBox->setEnabled(true);
        ui->stopcomboBox->setEnabled(true);
        ui->OpenButton->setText(tr("打开串口"));
        ui->SendDataButton->setEnabled(false);
    }
}

void MainWindow::Read_Data()      //读取数据功能函数
{
    QByteArray buf ;
    buf = serial->readAll() ;
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText() ;
        str+=tr(buf) ;

        QByteArray str2 = QByteArray::fromHex (str.toLatin1().data());
        QString strDis;

        QString str3 = str2.toHex().data();    //以十六进制显示
        str3 = str3.toUpper ();           //转换为大写
        for(int i = 0;i<str3.length ();i+=2)   //填加空格
        {
              QString st = str3.mid (i,2);
              strDis += st;
              strDis += " ";
        }
        //ui->textEdit->clear();
        ui->textEdit->append(strDis);

    }

    buf.clear();
}


      main函数则不需要修改,创建好默认代码即可。同时务必记得在.pro文件中添加

QT       += serialport

      运行后的结果为:



  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值