嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)

接着嵌入式QT上位机开发之串口助手(上)来完善一下串口助手的功能,上一篇博客已经实现了自动获取的功能了。

首先要在头文件里面包含一下头文件,再定义一个QSerialPort类型的参数;其次打开widget.cpp文件,在这个文件里面也要定义一个QSerialPort类型的参数。
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第1张图片
修改完成之后,编译运行一下,看是否有报错,无报错,继续接着操作串口。
第一步:对串口进行初始化
串口的初始化是在“打开”串口的时候进行的,所以就要将“打开”这个操作将窗口初始化关联起来,通过信号和槽来进行关联。回忆一下,进行关联的方式有两种:一个是选中控件,右键点击“转到槽”;另外一种是手动关联。这里选择第一种方式去关联,然后在槽函数里面去初始化按钮。这样的话,点击“打开”按钮,槽函数就会对串口进行初始化。在设计的串口助手里面,有“串口号”、“波特率”、“数据位”、“停止位”、“校验位”这五种属性,在qt软件中的“ QSerialPort”里面都已经定义好了,直接拿来用就可以。点击“帮助”—》“索引”,搜索QSerialPort就可以看到。
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第2张图片
先在槽函数中定义一些变量(数据位,停止位等),定义完变量之后,要对这些变量进行赋值。
在ui界面里面有下拉菜单,在下拉菜单下面有很多的选项,比如:就波特率来说,下拉菜单下面有4800/9600/115200三个选项,当我们选中某一个的时候,我们如何将我们选中的值赋给槽函数中定义的变量呢?使用if判断就可以实现该功能了(或者还可以使用Switch case语句也是可以的)。
widget.cpp的代码如下:

#include "widget.h"
#include "ui_widget.h"
//包含头文件
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //先定义一个QStringList

   QStringList serialNamePort;
   serialPort = new QSerialPort();
   foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
       serialNamePort << info.portName();
       //QSerialPortInfo是串口的信息类,是存放串口信息的。
       //QSerialPortInfo::availablePorts是自动搜索当前的可用串口,其返回值是一个数组,数组的元素是QSerialPortInfo类型的
       //然后将返回值加到了QStringList这个二维数组里面。
   }
   ui->serialCb->addItems(serialNamePort);
   //将代码实现的功能显示在ui界面里面,这就是为啥刚才改名字。

}
//通过这段代码就可以把当前搜索的可用的串口在ui界面显示出来

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

void Widget::on_openBt_clicked()
{
    //先来定义一些变量:波特率、数据位、停止位、校验位
    QSerialPort::BaudRate bauRate; //波特率
    QSerialPort::DataBits dataBits; //数据位
    QSerialPort::StopBits stopBits; //停止位
    QSerialPort::Parity checkBits; //校验位

    //定义完变量之后,要给变量进行赋值
    //对波特率进行判断(对变量逐一进行判断)
    if(ui->baundrateCb->currentText()== "4800"){
        bauRate = QSerialPort::Baud4800;
        //如果ui界面的波特率控件参数选择的是4800,那么对应在QSerialPort里面的波特率就是4800
    }
    else if(ui->baundrateCb->currentText()== "9600"){
        bauRate = QSerialPort::Baud9600;
    }
    else if(ui->baundrateCb->currentText()== "115200"){
        bauRate = QSerialPort::Baud115200;
    }

    //对数据位进行判断
    if (ui->dataCb->currentText() == "5") {
        dataBits = QSerialPort::Data5;
    }else if(ui->dataCb->currentText() == "6") {
        dataBits = QSerialPort::Data6;
    }else if(ui->dataCb->currentText() == "7") {
        dataBits = QSerialPort::Data7;
    }else if(ui->dataCb->currentText() == "8") {
        dataBits = QSerialPort::Data8;
    }

    //设置停止位
    if (ui->stopCb->currentText() == "1" ) {
        stopBits = QSerialPort::OneStop;
    } else if(ui->stopCb->currentText() == "1.5" ) {
        stopBits = QSerialPort::OneAndHalfStop;
    } else if(ui->stopCb->currentText() == "2" ) {
        stopBits = QSerialPort::TwoStop;
    }

    //设置校验位
    if(ui->checkCb->currentText() == "none" ) { checkBits = QSerialPort::NoParity; }
    //判断完变量的值之后,编译运行一下,然后要对串口属性值进行设置

    //填充串口对象的属性值
    //要先选中串口,对应的端口是ui界面里面的serialCb
    serialPort->setPortName(ui->serialCb->currentText());
    //设置波特率、数据位等
    serialPort->setBaudRate(bauRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(checkBits);

    //设置好属性后打开串口,打开串口之前要先判断一下串口有没有打开成功
    if(serialPort->open(QIODevice::ReadWrite) == true){
        //ReadWrite设置的是可读可写的属性
        QMessageBox::information(this,"提示","成功");
    }else{QMessageBox::critical(this,"提示","失败");
    }
}

这样,串口的初始化工作就做好啦。插上u转串线,编译运行结果如下:
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第3张图片
但只能打开一次,再次点击打开的时候,会提示出错,因为我们现在已经把串口打开了。
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第4张图片
第二步:设计“关闭功能”
关闭的功能设计很简单,在ui文件中选中关闭按钮,右键点击转到槽(自动关联),在槽函数中写入关闭的语句即可。

void Widget::on_closeBt_clicked()
{
    serialPort->close();
}

如此一来,再次编译运行的时候,就可以先打开串口,然后再关闭,下次再打开就不会提示失败啦。

嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第5张图片
第三步:“发送”与“接收”功能
对于发送功能,它不仅仅涉及到的是"发送",还涉及到“接收”。串口的收发实际上也依赖于信号与槽,但是此处就不能使用“自动关联”的办法了,要用到“手动关联”。
(1)串口接收(在做“接收数据的任务”的时候,都可以这样做)
在索引里面查看QSerialPort里面都有哪些信号,之后点击QObject发现“readyRead”是跟读数据相关的,所以选择关联该信号。
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第6张图片

   //手动关联实现串口的收发
   connect(serialPort,SIGNAL(readyRead()),this,SLOT(`serialPort`ReadyRead_slot()));
   //关联readyRead信号,然后还需要声明槽函数,声明槽函数需要在widget.h里面声明槽函数

在widget.h里面声明槽函数
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第7张图片

当串口有数据可读的时候,就会触发“readyRead”信号,进而触发“serialPortReadyRead_slot()槽函数”,开始实现槽函数。在槽函数里面,就可以进行“读”操作了,将读到的数据存放在buf里面,接收的这一部分就做好啦,代码如下:

//实现一下手动关联的槽函数
void Widget::serialPortReadyRead_slot(){
    //有数据过来的时候,就要在ui界面的接收框里显示
    //当有数据过来的时候,就会发出readyRead()信号,发出这个信号之后,就会进到槽函数里面 先定义一个qstring类型的buf,用来接收数据
    QString buf;
    buf = QString(serialPort->readAll());
    //接下来将接收到的数据显示到ui界面的接收框里面
    ui->recvEdit->appendPlainText(buf);
}

(2)串口发送
串口发送可以选择自动关联,选住控件,右键点击“转到槽”

void Widget::on_sendBt_clicked()
{
    serialPort->write(ui->sendEdit->text().toLocal8Bit().data());
    //由于这里读出来的类型是QString类型,所以还需要转换一下
}

第四步:清空功能
选择自动关联,选住控件,右键点击“转到槽”

void Widget::on_clearBt_clicked()
{
    ui->recvEdit->clear;
}

做好所有的功能之后,连接一下开发板,看看这个串口助手是否能用。
给开发板上电,然后编译运行该工程,有如下结果:
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第8张图片
测试一下“清空功能”
嵌入式学习之QT学习---6 QT上位机开发之串口助手(下)_第9张图片

你可能感兴趣的:(ITOP4412学习,QT,qt,学习,单片机)