本章知识点
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));
}
}
代码运行效果