首先新建工程界面设计

在这里我就不做详述了,注意的一点就是接收框是QPlainTextEdit,我把我的整体放上来,有点丑,你们可以自由发挥。

在写之前我先把我创建的一些全局变量什么的写出来,免得下面的代码看不太明白:
类是这样的:

class uartmain : public QWidget
{Q_OBJECTpublic:explicit uartmain(QWidget *parent = nullptr);~uartmain();QSerialPort *uart;QTimer *timer;QString uartbuf;bool HEX_status;bool timesend_status;QTimer *timersend;int numbrece;int numbsend;private slots:void on_sendBtn_clicked();void on_openBtn_clicked();void on_closeBtn_clicked();void on_clearBtn_clicked();void slotsUartReadyread();void slotTimeout();void slotTimeSendout();void on_HexcheckBox_clicked();void on_TimeScheckBox_2_stateChanged(int arg1);private:Ui::uartmain *ui;
};

然后构造函数是这样的:

uartmain::uartmain(QWidget *parent) :QWidget(parent),ui(new Ui::uartmain)
{ui->setupUi(this);uart = new QSerialPort(this);timer = new QTimer(this);timersend = new QTimer(this);numbsend = 0;numbrece = 0;HEX_status = 0;timesend_status = 0;//下面这段代码我后面还会再进行介绍。//availablePorts();是返回当前系统所有能用的串口,返回值是一个容器QList<QSerialPortInfo> info  = QSerialPortInfo::availablePorts();for(int i=0 ; i<info.size(); i++){ui->NamecomboBox->addItem(info[i].portName());  //addItem加入数据到下拉菜单}connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));connect(timersend, SIGNAL(timeout()), this, SLOT(slotTimeSendout()));connect(uart, SIGNAL(readyRead()), this, SLOT(slotsUartReadyread()));}

串口类 Qserialport 的使用

既然我们要做串口,单单页面设计是不够的,这里我们用到的类是Qserialport类
这里是关于这个类的一些介绍,支持QT5.1以上版本;

QSerialPort Class
Provides functions to access serial ports. More...Header:
#include <QSerialPort>
qmake:
QT += serialport
Since:
Qt 5.1
Inherits:
QIODevice

知道我们为什么要介绍这个类的信息了吧,因为我们要在 .pro 文件里先把qmake加上去然后包含头文件
才能正常使用。

QT       += serialport    //.pro文件里添加
#include <QSerialPort>    //.h文件里添加

串口的打开与关闭

然后就正式进入到我们串口通信阶段,在我们使用串口的时候第一件事是不是需要选择串口端,配置波特率,数据位这些等信息?那么他来了:
第一个要做的是自动搜索能使用的串口,并把它加到我们的串口那个数据下拉菜单中:

#include <QSerialPortInfo> //用到了这个库,请手动包含到.h文件下,他才会帮你自动搜索//availablePorts();是返回当前系统所有能用的串口,返回值是一个容器QList<QSerialPortInfo> info  = QSerialPortInfo::availablePorts();for(int i=0 ; i<info.size(); i++){ui->NamecomboBox->addItem(info[i].portName());  //addItem加入数据到下拉菜单}

其次就是一些波特率,数据位,停止位,校验位的选择了我们直接写到打开串口按钮的信号槽函数里去:

void uartmain::on_openBtn_clicked()
{//定义变量QString uartname;QSerialPort::DataBits databit;     QSerialPort::BaudRate baudrate;QSerialPort::StopBits stopbit;QSerialPort::Parity paritybit;
//根据我们下拉菜单选择赋值//串口名字uartname = ui->NamecomboBox->currentText();//波特率if(ui->BaudratecomboBox->currentText() == "9600"){baudrate = QSerialPort::Baud9600;}else if(ui->BaudratecomboBox->currentText() == "115200"){baudrate = QSerialPort::Baud115200;}//数据位if(ui->DataBitcomboBox_4->currentText() == "5"){databit = QSerialPort::Data5;}else if(ui->DataBitcomboBox_4->currentText() == "6"){databit = QSerialPort::Data6;}else if(ui->DataBitcomboBox_4->currentText() == "7"){databit = QSerialPort::Data7;}else if(ui->DataBitcomboBox_4->currentText() == "8"){databit = QSerialPort::Data8;}//停止位if(ui->StopcomboBox->currentText() == "1"){stopbit = QSerialPort::OneStop;}else if(ui->StopcomboBox->currentText() == "1.5"){stopbit = QSerialPort::OneAndHalfStop;}else if(ui->StopcomboBox->currentText() == "2"){stopbit = QSerialPort::TwoStop;}//校验位if(ui->paritycomboBox_2->currentIndex() == 0){paritybit = QSerialPort::OddParity;}else if(ui->paritycomboBox_2->currentIndex() == 1){paritybit = QSerialPort::EvenParity;}else if(ui->paritycomboBox_2->currentIndex() == 2){paritybit = QSerialPort::NoParity;}//把参数设置到uart里uart->setPortName(uartname);uart->setBaudRate(baudrate);uart->setParity(paritybit);uart->setDataBits(databit);uart->setStopBits(stopbit);//打开串口并给对应的提示if(!uart->open(QIODevice::ReadWrite)){ //以可读可写的方式打开QMessageBox::critical(this,"warnning","打开失败");}else{QMessageBox::information(this,"提示","打开成功");ui->Statuslabel->setText("串口已打开");}
}

写完了打开我们就写串口的关闭,关闭还不简单?eq二连天崩地裂一个close搞定:

void uartmain::on_closeBtn_clicked()
{uart->close();ui->Statuslabel->setText("串口已关闭");
}

串口数据的接收以及16进制显示

到这里之后你是否有个疑问就是我们是不是已经打开串口了,那么该怎么接收和发送数据呢?
这里就又要用到QT的信号槽了,Qserialport类里面继承了QIODevice类里的void QIODevice::readyRead()信号槽,只要有数据接收,就会触发槽函数,但是直接就在槽函数里接收数据并显示的话,会出现接收到的数据短截的情况,所以我们配合定时器一起使用,归根结低串口接收和发送无非就是是read() 和 write()。需要注意的是这两个操作都是非阻塞的。具体方法如下:

 connect(timersend, SIGNAL(timeout()), this, SLOT(slotTimeSendout()));connect(uart, SIGNAL(readyRead()), this, SLOT(slotsUartReadyread()));
//假如没有收完数据,就会一直发槽函数,定时器会被 一直重置,不会超时
//当数据发完,就不会重启定时器,就会超时这个时候就会收到完整的数据
void uartmain::slotsUartReadyread()
{timer->start(20);  //重启定时器为20msuartbuf.append(uart->readAll());//追加写入到uartbuf里
}//超时进入  说明数据收完了
void uartmain::slotTimeout()
{timer->stop(); //停止定时器,否则一直进入这里;//为1  是16进制显示   否则就正常打印if(HEX_status == 1){// QByteArray str2 = QByteArray::fromHex (uartbuf.toLatin1().data());//按十六进制编码接入文本  已经接受保存在uartbuf中 所以不需要这句了QString strDis;QString str3 = uartbuf.toUtf8().toHex().data();//以十六进制显示str3 = str3.toUpper ();//转换为大写for(int i = 0;i<str3.length ();i+=2)//填加空格{QString st = str3.mid (i,2);strDis += st;strDis += " ";}ui->recEedit->appendPlainText(strDis);}else{ui->recEedit->appendPlainText(uartbuf);}numbrece += uartbuf.toLocal8Bit().length();ui->receDataedit->setText(QString::number(numbrece));uartbuf.clear();qDebug("HEX_status = %d", HEX_status);}

在这里还写了十进制显示和16进制显示,主要是通过checkbox空间实现状态切换,代码简单的一批:

void uartmain::on_HexcheckBox_clicked()
{HEX_status ^= 1;
}

串口的发送和定时发送

写到这,我已经懒得在写什么客套话了,来吧,展示,上代码:

void uartmain::on_sendBtn_clicked()
{QString buf = ui->senDedit->text();uart->write(buf.toUtf8());  //转QByteArray    转char * 用 buf.tolocal8bit().data()numbsend += buf.toLocal8Bit().length();ui->sendDataedit->setText(QString::number(numbsend));
}

还是多啰嗦一句吧,write函数的参数只有QBytearry和char * 两种类型,而我们从QLineEdit里面读出来的是QString类型,所以先转再发送。
简单的发送我们搞定之后就到稍微有一点点点难的定时发送了,定时发送定时发送,顾名思义就是一个定时一个发送,配合一个checkbox控件轻松实现:
checkbox信号槽函数写法:

void uartmain::on_TimeScheckBox_2_stateChanged(int arg1)
{qDebug()<<arg1;//方法一if(arg1 == 2){timersend->start(ui->msedit->text().toInt());}else if(arg1 ==0){timersend->stop();}
}

关联槽函数

 connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));

超时进入自动发送信号槽函数

//超时进入自动发送
void uartmain::slotTimeSendout()
{on_sendBtn_clicked();  //直接调用发送函数就可以了timersend->start(ui->msedit->text().toInt());}

数据量统计和界面清除

关于数据量统计:到这里你还想着要数据量统计的就真的是不认真了,是不是在前面的发送和接受的下面都有了数据量的统计,什么?没有?你信不信我无情铁手a 加外圈q w a 外刮内烫给你一套带走?仔细看一下代码,都写在里面了,我就不摘出来给你们看了。
那么界面清除的我其实也不想放了,但是秉承着善良,天真,可爱送佛送到西的原则,代码双手奉上:

void uartmain::on_clearBtn_clicked()
{ui->recEedit->clear();ui->sendDataedit->clear();ui->receDataedit->clear();numbrece = 0;numbsend = 0;uartbuf.clear();
}

哈哈哈是不是被惊艳到,就是各种clear,clear就完事了。

总结

这是最近我在学的一个QT串口助手Qseriaport类的使用的全部内容就都在这里了,分享给大家,代码运行正常,可能会存在某些bug但目前未知,如果有不恰当的地方,请私信小编改正,交流学习,共同进步。感谢阅读,动动小手点点赞啦。

如何用QT做串口调试助手Qseriaport类的使用相关推荐

  1. 基于QT的串口调试助手

    大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步.最近在更新C/C++方面的知识,感兴趣的欢迎关注博主,可以去专栏查 ...

  2. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

    如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...

  3. QT Modbus RTU调试助手(包含算法实现CRC MODBUS16校验)

    QT Modbus RTU调试助手 在类构造函数中将UI初始化和串口对象定义以及查找串口 串口设置 串口接受 QT延时函数 CRC校验 发送串口数据函数 总结 在类构造函数中将UI初始化和串口对象定义 ...

  4. 【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

    这章来学习串口数据流操作.仿照已有成品制作一个用Qt开发的串口调试助手. 介于篇幅有限,本篇只介绍一个最简单的能收发的串口调试助手的制作.后续篇幅会陆续对剩余代码进行讲解,并添加各种功能,对显示.操作 ...

  5. Qt实践录:串口调试助手

    由于项目需要使用到串口调试及测试,为了练手,使用 Qt 编写一个串口调试助手.本文按开发的过程进行简单介绍,同时也涉及部分用到的模块代码.详细代码参考源码仓库. 工具特性 具体功能 具备串口收发功能. ...

  6. 学习笔记:使用Qt制作一个串口调试助手

    界面设计参考了野火串口调试助手C#版 功能基本实现!实现效果看图: 第一步:制作图形界面 注意控件命名要又辨识度,不然在编写代码时将是很很痛苦的 第二步:添加相应的库 添加此次工程所需要的串口库,在工 ...

  7. 使用Qt打造属于自己的串口调试助手

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家. 点击跳转到教程,人工智能编程入门博客 一个专注于嵌入式知识分享,学习路上不迷路的公众号,欢迎关注. 想加技术交流群的 ...

  8. 一款基于Qt的跨平台开源串口调试助手EasySerial

    文章目录 1. 简述 2. 开发步骤 2.1 界面布置 2.2 串口搜索与打开 2.3 ASCII/HEX接收 2.4 接收数据保存 2.5 ASCII/HEX发送 2.6 周期发送 2.7 读取文件 ...

  9. 怎么做串口调试软件?

    嗯 ~~~ 说一下我自己写的串口助手吧, 名字叫 Bittly, 样子呢长下面这个样子 Bittly 指令调试界面 1. 需求确认 一开始使用的是类似于XCOM或者SSCOM之类的串口调试助手,他们的 ...

最新文章

  1. 字符之间或者结构体之间比较
  2. [集合]线程安全的HashMap
  3. 从项目到产品: 软件时代需要价值流架构师 | IDCF
  4. 想被千年后的人知道吗,快去GitHub上传代码吧!
  5. 关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案
  6. 个人量化策略整理_较好
  7. python列表购物
  8. 原生态mysql_MySQL 原生操作-速查
  9. 硬核干货!揭秘波士顿动力背后的专利技术
  10. C# 构造函数base()实例演示
  11. 用Retinaface_pytorch项目检测人脸+ Python 3 剪切人脸图片并保存
  12. Scala编译后的class文件反编译的结果
  13. 论文下载哪家强 | caj 官网软件下载
  14. (附源码)springboot民宿网站 毕业设计 221901
  15. 浅析 HTML console
  16. 跟着Nature Microbiology学作图:R语言ggplot2做散点图添加拟合曲线和p值
  17. 西南科技大学计算机专业全国排名,西南科技大学为什么在全国大学排名很低?...
  18. 求最大公因数的三种算法及简要说明
  19. 2022.07.12 第九小组 高小涵 学习笔记
  20. bash参考手册之三(基本的Shell特性)续二

热门文章

  1. 如何从零起步学习AI
  2. python语言基础(六)列表、元组、字典、集合
  3. Ubuntu布置Django项目
  4. 数据库原理及应用-李唯唯主编-实验3-4
  5. 老人与海好词100英文带翻译_老人与海优美段落英文,英文的优美句子,带翻译,越多越好,谢谢...
  6. 在WIN7、WIN10操作系统用WebDAV映射网络驱动器需要的操作
  7. 囚徒健身(中文完整版)(保罗·威德)
  8. java实现条形图_java – 使用Apache POI在Excel中创建条形图
  9. 电脑解锁后黑屏有鼠标_电脑开机黑屏只有鼠标怎么办解决
  10. 2020年,你必须掌握的前端技术栈