QT笔记-串口数据接收发送

本章知识点

1.串口数据接收与发送
2.当打开A按钮B按钮无法使用
3.下拉框,文本框使用
4.下拉框选择内容发送至文本框显示

注意事项

串口函数的使用需在.pro文件内添加QT += core gui serialport

代码示例

.pro

#-------------------------------------------------
#
# Project created by QtCreator 2020-04-25T13:06:20
#
#-------------------------------------------------

QT       += core gui  serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = boke_06
TEMPLATE = app


SOURCES += main.cpp\
        boke.cpp

HEADERS  += boke.h

FORMS    += boke.ui

.h

#ifndef BOKE_H
#define BOKE_H

#include <QWidget>
#include"QLabel"
#include"QComboBox"
#include<QSerialPort>
#include<QPushButton>
#include<QTextEdit>
#include<QPlainTextEdit>
#include<QSerialPort>


namespace Ui {
class boke;
}

class boke : public QWidget
{
    Q_OBJECT

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

    //串口函数的使用需在.pro文件内添加QT       += core gui  serialport

    //创建串口号提示标签
    QLabel *labe1;
    //创建停止位提示标签
    QLabel *labe2;
    //创建波特率提示标签
    QLabel *labe4;
    //创建校验位提示标签
    QLabel *labe5;
    //创建数据位提示标签
    QLabel *labe6;

    //创建停止位选择后在标签显示文本
    QLabel *labe7;
    //创建串口号选择后在标签显示文本
    QLabel *labe3;

    //创建串口号下拉款指针
    QComboBox *box;
    //创建波特率下拉款指针
    QComboBox *box1;
    //创建校验位下拉款指针
    QComboBox *box2;
    //创建数据位下拉款指针
    QComboBox *box3;
    //创建停止位下拉款指针
    QComboBox *box9;

    //创建打开按钮
    QPushButton *dakai1;
    //创建发送按钮
    QPushButton *dakai2;

    //创建数据接收文本框
    QTextEdit *jiesou;
    //创建数据发送文本框
    QPlainTextEdit *fasong;

    //去获取当前设置的五个参数(串口号,波特率。。。。。)
    bool geserialportConfig(void);

private:
    Ui::boke *ui;

    //设置串口成员**重点
    QSerialPort mSerialPort;
    //增加一个是否打开变量**重点
    bool mIsopen;

    //五个参数接收成员
    QString box4;  //串口
    QString box5;  //波特率
    QString box6;  //校验位
    QString box7;  //数据位
    QString box8;  //停止位

private slots:
   //打开返回值,获取当前打开按钮是不是打开状态,若打开禁止设置五个参数
   void  on_on();
   //发送返回值,判断发送按钮是否可以发送
   void  on_ok();
   //接收返回值,显示接收文本
   void  on_js();

};

#endif // BOKE_H

.cpp

#include "boke.h"
#include "ui_boke.h"
#include<QDebug>
#include<QSerialPortInfo>
#include<QList>


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

    //初始化打开变量
    mIsopen = false;

    //创建串口号下拉框
    box = new QComboBox(this);
    //编辑串口号下拉框所在位置,大小,
    box->setGeometry(QRect(64,34,54,20));

    //创建波特率下拉框
    box1 = new QComboBox(this);
    //添加波特率下拉框内容
    box1->addItem("9600");
    box1->addItem("19200");
    box1->addItem("115200");
    //编辑波特路下拉框所在位置xy,大小长宽
    box1->setGeometry(QRect(64,94,60,20));

    //创建校验位下拉框
    box2 = new QComboBox(this);
    //添加校验位下拉框内容
    box2->addItem("NONE");
    box2->addItem("ODD");
    //编辑校验位下拉框所在位置xy,大小长宽
    box2->setGeometry(QRect(64,114,60,20));

    //创建数据位位下拉框
    box3 = new QComboBox(this);
    //添加数据位下拉框内容
    box3->addItem("8");
    box3->addItem("7");
    box3->addItem("6");
    box3->addItem("5");
    //编辑数据位下拉框所在位置xy,大小长宽
    box3->setGeometry(QRect(64,134,60,20));

    //创建停止位位下拉框
    box9 = new QComboBox(this);
    //添加停止位下拉框内容
    box9->addItem("1");
    box9->addItem("1.5");
    box9->addItem("2");
    //编辑停止位下拉框所在位置xy,大小长宽
    box9->setGeometry(QRect(64,74,60,20));

    //创建串口号显示标签
    labe3=new QLabel(this);
    labe3->setText("串口显示");
    labe3->setGeometry(QRect(124,34,60,20));
    labe3->show();

    //创建停止位显示标签
    labe7=new QLabel(this);
    labe7->setText("停止显示");
    labe7->setGeometry(QRect(124,74,60,20));
    labe7->show();


    //创建串口号标签
    labe1 =new QLabel(this);
    //标签显示文本
    labe1->setText("串口号");
    //编辑标签大小显示位置
    labe1->setGeometry(QRect(10,34,50,20));
    labe1->show();

    //创建停止位标签
    labe2 =new QLabel(this);
    //标签显示文本
    labe2->setText("停止位");
    //编辑标签大小显示位置
    labe2->setGeometry(QRect(10,74,60,20));
    labe2->show();

    //创建波特率标签
    labe4=new QLabel(this);
    labe4->setText("波特率");
    labe4->setGeometry(QRect(10,94,60,20));
    labe4->show();

    //创建校验位标签
    labe5=new QLabel(this);
    labe5->setText("校验位");
    labe5->setGeometry(QRect(10,114,60,20));
    labe5->show();

    //创建数据位标签
    labe6=new QLabel(this);
    labe6->setText("数据位");
    labe6->setGeometry(QRect(10,134,60,20));
    labe6->show();

    //创建打开按钮
    dakai1=new QPushButton(this);
    dakai1->setGeometry(QRect(10,180,60,30));



    //创建发送按钮
    dakai2=new QPushButton(this);
    dakai2->setText("发送");
    dakai2->setGeometry(QRect(10,220,60,30));

    //创建接收框
    jiesou=new QTextEdit(this);
    jiesou->setGeometry(QRect(190,30,200,100));
    jiesou->show();

    //创建发送框
    fasong=new QPlainTextEdit(this);
    fasong->setGeometry(QRect(190,150,200,100));
    fasong->show();

    //信号与槽(下拉框box,发送信号,标签,显示信号)当选择串口号,在labe3显示选择的串口号
    connect(box,SIGNAL(currentIndexChanged(QString)),labe3,SLOT(setText(QString)));

    //信号与槽(下拉框box,发送信号,标签,显示信号)当选择停止位,在labe7显示选择的串口号
    connect(box9,SIGNAL(currentIndexChanged(QString)),labe7,SLOT(setText(QString)));

    //智能识别当前系统有效串口号
    //QSerialportinfo这个函数返回一个列表保存在创建的函数中
    QList<QSerialPortInfo> serialportinfo =QSerialPortInfo::availablePorts();
    //将函数填充到串口下拉列表框中,返回当前列表的数量
    int count =serialportinfo.count();
    //当做数组来访问
    for(int i=0 ;i<count;i++)
    {
        //当你访问一个数组,他就返回一个下表给你.显示名称
        box->addItem(serialportinfo.at(i).portName());
    }

    dakai1->setText("打开");

    //给发送位设置初始状态
    dakai1->setEnabled(true);
    dakai2->setEnabled(false);

    //SLOT自定义槽,封装了档按钮在某种状态的时候不能操作那些,在某种状态的时候可以操作那些
    connect(dakai1,SIGNAL(clicked()),this,SLOT(on_on()));

    //发送消息
    connect(dakai2,SIGNAL(clicked()),this,SLOT(on_ok()));

    //接收数据
    connect(&mSerialPort,SIGNAL(readyRead()),this,SLOT(on_js()));





//    //串口设置需添加  QT       += core gui serialport  和  QSerialPort mSerialPort;
//    //设置串口号
//    mSerialPort.setPortName("COM1");
//    //设置波特率
//    mSerialPort.setBaudRate(QSerialPort::Baud115200);
//    //设置校验位
//    mSerialPort.setParity(QSerialPort::NoParity);
//    //设置数据位
//    mSerialPort.setDataBits(QSerialPort::Data8);
//    //设置停止位
//    mSerialPort.setStopBits(QSerialPort::OneStop);
//    //打开窗口
//    mSerialPort.open(QSerialPort::ReadWrite);
//    //判断串口是否打开
//    if(true  == mSerialPort.isOpen())
//    {
//        //若打开串口,内部回复串口打开成功
//        qDebug() << "串口打开成功";
//        //向外发送信息
//        mSerialPort.write("Hello world");
//    }
}

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


//获取当前五个参数的配置,串口,波特路。。。。
bool boke::geserialportConfig()
{
    //获取串口配置
    box4 = box->currentText();
    box5 = box1->currentText();
    box6 = box2->currentText();
    box7 = box3->currentText();
    box8 = box9->currentText();

    //设置串口配置
    mSerialPort.setPortName(box4);

    //设置波特率
    if("9600"==box5)
    {
        mSerialPort.setBaudRate(QSerialPort::Baud9600);
    }
    else if("19200"==box5)
    {
         mSerialPort.setBaudRate(QSerialPort::Baud19200);
    }
    else
    {
         mSerialPort.setBaudRate(QSerialPort::Baud115200);
    }
    //设置校验位
    if("NONE" == box6)
    {
         mSerialPort.setParity(QSerialPort::NoParity);
    }
    else if("ODD" == box6)
    {
         mSerialPort.setParity(QSerialPort::OddParity);
    }
    else
    {
         mSerialPort.setParity(QSerialPort::EvenParity);
    }
    //设置数据位
    if("5"==box7)
    {
        mSerialPort.setDataBits(QSerialPort::Data5);
    }
    else if("6"==box7)
    {
        mSerialPort.setDataBits(QSerialPort::Data6);
    }
    else if("7"==box7)
    {
        mSerialPort.setDataBits(QSerialPort::Data7);
    }

    else
    {
        mSerialPort.setDataBits(QSerialPort::Data8);
    }
    //设置停止位
    if("1.5" == box8)
    {
        mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
    }
    else if("2" == box8)
    {
        mSerialPort.setStopBits(QSerialPort::TwoStop);
    }
    else
    {
        mSerialPort.setStopBits(QSerialPort::OneStop);
    }

    //返回打开按键的结果
    return mSerialPort.open(QSerialPort::ReadWrite);


}


void  boke::on_on()
{

    //判断当前打开按钮是不是在true状态
    if(true == mIsopen)
    {
        //当前串口助手已经打开一个串口,这时应该执行关闭动作
        dakai1->setText("打开");
        mSerialPort.close();
        mIsopen = false;

        dakai2->setEnabled(mIsopen);
        box->setEnabled(true);
        box1->setEnabled(true);
        box2->setEnabled(true);
        box3->setEnabled(true);
        box9->setEnabled(true);
    }
    else
    {
        //当前串口助手已经打开一个串口,这时应该执行打开串口动作
        if(true==geserialportConfig())
        {
            mIsopen=true;
            dakai1->setText("关闭");
            //提示:串口打开成功,端口号
            qDebug()<<"成功打开串口"<<box;

            //串口打开成功禁止操作别的按钮
            dakai2->setEnabled(mIsopen);
            box->setEnabled(false);
            box1->setEnabled(false);
            box2->setEnabled(false);
            box3->setEnabled(false);
            box9->setEnabled(false);

        }
        else
        {
            mIsopen=false;
        }
    }
}


void  boke::on_ok()
{
    //判断发送按钮可不可以发送
    if(true==mIsopen)
    {
        mSerialPort.write(fasong->toPlainText().toStdString().c_str());
    }
}

//接收串口数据
void  boke::on_js()
{
    if(true==mIsopen)
    {
        QByteArray recvDate =mSerialPort.readAll();

        jiesou->append(QString(recvDate));
    }
}

代码运行效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值