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

首先要在头文件里面包含一下头文件,再定义一个QSerialPort类型的参数;其次打开widget.cpp文件,在这个文件里面也要定义一个QSerialPort类型的参数。

修改完成之后,编译运行一下,看是否有报错,无报错,继续接着操作串口。
第一步:对串口进行初始化
串口的初始化是在“打开”串口的时候进行的,所以就要将“打开”这个操作将窗口初始化关联起来,通过信号和槽来进行关联。回忆一下,进行关联的方式有两种:一个是选中控件,右键点击“转到槽”;另外一种是手动关联。这里选择第一种方式去关联,然后在槽函数里面去初始化按钮。这样的话,点击“打开”按钮,槽函数就会对串口进行初始化。在设计的串口助手里面,有“串口号”、“波特率”、“数据位”、“停止位”、“校验位”这五种属性,在qt软件中的“ QSerialPort”里面都已经定义好了,直接拿来用就可以。点击“帮助”—》“索引”,搜索QSerialPort就可以看到。

先在槽函数中定义一些变量(数据位,停止位等),定义完变量之后,要对这些变量进行赋值。
在ui界面里面有下拉菜单,在下拉菜单下面有很多的选项,比如:就波特率来说,下拉菜单下面有4800/9600/115200三个选项,当我们选中某一个的时候,我们如何将我们选中的值赋给槽函数中定义的变量呢?使用if判断就可以实现该功能了(或者还可以使用Switch case语句也是可以的)。
widget.cpp的代码如下:

#include "widget.h"
#include "ui_widget.h"
//包含头文件
#include <QSerialPortInfo>
#include <QMessageBox>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//先定义一个QStringListQStringList 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界面里面的serialCbserialPort->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转串线,编译运行结果如下:

但只能打开一次,再次点击打开的时候,会提示出错,因为我们现在已经把串口打开了。

第二步:设计“关闭功能”
关闭的功能设计很简单,在ui文件中选中关闭按钮,右键点击转到槽(自动关联),在槽函数中写入关闭的语句即可。

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

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


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

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

在widget.h里面声明槽函数

当串口有数据可读的时候,就会触发“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上位机开发之串口助手(下)相关推荐

  1. 嵌入式学习之QT学习---5 QT上位机开发之串口助手(上)

    1.qt的三驾马车 qt下的串口编程 qt下的网络编程 qt下操作GPIO 2.设计ui界面 设计ui界面之前,需要新建一个QT工程,简要再回顾一下创建QT工程的步骤:new project-> ...

  2. 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    <基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发> #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发.下面是采用通过 ...

  3. 1.QT上位机开发之表格设计-TABLE WIDGET

    QT上位机开发之表格设计-TABLE WIDGET 开发平台: QT Designer QT5 系统:Windows 11 软件语言:python 项目需要开发上位机软件用于模块测试,自己之前没有做过 ...

  4. python上位机开发实例-python上位机

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 若python上位机接受到的字符为"1',则print出ok,如果字符是 ...

  5. Matlab上位机开发

    Matlab上位机开发 1 了解上位机 1.1 上位机的作用 1.2 常用上位机开发方式 1.2.1 Windows上位机(基于串口通信) 1.2.2 Android上位机(基于网络通信) 1.3 教 ...

  6. 1.3-原来这才是大家常用的上位机开发平台

    一.有哪些上位机开发平台(优缺点和使用场景) 由于上位机概念的广泛性,所以上位机开发平台可以是任何开发平台.这里介绍几个常用的经典的上位机开发平台及其特性. VB(Visual Basic) 开发语言 ...

  7. 上位机开发 常用的平台及语言

    首先看一下!全球范围内,编程语言流行度! 排名 编程语言 流行度 1 Java 16.896% 2 C 15.773% 3 Python 9.704% 4 C++ 5.574% 5 C# 5.349% ...

  8. 【上位机】通过QTCreator编写WIFI上位机与网络调试助手通信绘制曲线

    文章目录 前言 一.使用QT Creator编写上位机 二.上位机与网络调试助手联调 三.总结 前言 17年电赛H题中要求编写WIFI上位机实现远程幅频特性曲线显示, 以下是本人在近期摸索出来的一些心 ...

  9. 哈喽上位机(上位机开发指南)

    哈喽,上位机! -------上位机开发指南 作者:Robert Zhang 本博客以一个程序猿的角度解答了: - 有关上位机开发的疑惑 - 上机软件开发需要学习哪些知识 - 开发一个完整商业软件所需 ...

  10. java上位机开发(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 目前对于java语言,很多人都认为太简单.其实这是不对的,因为某种意义上来说所,java语言就像 ...

最新文章

  1. [文摘]Maven安装jar包的命令
  2. 正则表达式的学习二:正则表达式的匹配规则总结
  3. Win10下访问linux的ext4分区文件并拷贝
  4. 网站安全配置---挂载路由导航
  5. 资源打包Assetbundle .
  6. 意大利面条:面向过程的代码模型
  7. MyBatis(二)------使用JDBC编程问题总结
  8. 全球及中国木材干燥窑行业研究及十四五规划分析报告
  9. 用typhon制作嵌入式Chromium浏览器
  10. 星星之火OIer:C++大纲
  11. 机器人无限火力无限e符文_2021LOL无限火力机器人天赋符文、出装推荐-无限火力机器人玩法介绍-色彩电竞...
  12. 离线数仓(10):ODS层实现之业务数据核对
  13. 天池竞赛——工业蒸汽量预测(完整代码分享)
  14. 极客日报:贾跃亭回应是否有回国打算:那必须的;顺丰将拿出 2 亿元给快递员加薪;OpenAI 宣布解散机器人团队
  15. 图、邻接矩阵、广度与深度优先、生成树
  16. el-select右侧图标换成自定义的箭头,且箭头向上
  17. Android初学之------Android Studio 运行java程序
  18. Glassfish JAVA容器中间件使用(咋个办呢 zgbn)
  19. Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源
  20. 【文本文件单词数统计】统计《哈姆雷特》作品文本文件中除一些冠词、代词、连接词之外出现最多的单词,打印数量最多的前十个单词

热门文章

  1. 计算机网络考研知识点总结,2020计算机专业考研的计算机网络部分知识点
  2. 【转】一篇易懂的CAN通讯协议指南1
  3. Java算法面试题(005) 求n边形周长的k等分点坐标(今日头条)
  4. pgadmin不显示服务器了,pgAdmin 9.5不显示所有数据库
  5. 神经网络可以计算任何函数的可视化证明
  6. Shiro面试题(二十道)
  7. 国外在线Md5,md4,mysql,Sha1,NTLM破解网站
  8. matlab 二元函数的极限,利用MATLAB软件求解一元和二元函数的极值
  9. ORA-03113: 通信通道的文件结尾
  10. linux 文件可视化工具下载,Linux 可视化管理工具