作者:Jack_G
时间:2021.10.12
版本:V1.0
上次修改时间:无
批注:自动获取com口

①在工程文件中添加支持包,(官方支持,没有的话使用官方的管理工具添加即可)

QT       += serialport

在.h中添加串口相关的支持包

#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息

②然后再UI界面添加控件

注意命名方式,按照易理解的方式命名,以便于以后写代码不混乱,作者在这里用layout进行约束,添加了最基础的功能控件,日历控件准备后期换成chart来画波形图

③自动获取串口号函数

comboBox_Serial为串口号的comboBox

void MainWindow::on_pushButton__Port_Search_clicked()
{ui->comboBox_Serial->clear();// 清除以前的串口信息foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ui->comboBox_Serial->addItem(info.portName());}
}

④波特率函数

在ui对象构造函数里添加一些基本设置
comboBox_Baud_rate为作者创建的端口号的 comboBox,这里只写了几个常用的,还有一个自定义的

  // 初始化ui->comboBox_Baud_rate->insertItem(0, "9600");ui->comboBox_Baud_rate->insertItem(1, "115200");ui->comboBox_Baud_rate->insertItem(2, "3000000");ui->comboBox_Baud_rate->insertItem(3, "自定义");ui->comboBox_Baud_rate->setCurrentIndex(1);ui->pushButton_send->setDisabled(true);

自定义部分:
创建一个comboBox波特率的currentIndexChanged槽函数,代码如下
其中serial是后面添加的类成员

void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{if(this->ui->comboBox_Baud_rate->currentIndex() == 3){this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入this->ui->comboBox_Baud_rate->setEditable(true);}else{this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入this->ui->comboBox_Baud_rate->setEditable(false);}serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}

⑤连接串口

再在private添加串口serial成员

QSerialPort serial;

如图

连接按钮的callback函数

void MainWindow::on_pushButton__Port_connect_clicked()
{if(this->ui->pushButton__Port_connect->text() == "连接"){serial.setPortName(ui->comboBox_Serial->currentText());serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());serial.setDataBits(QSerialPort::Data8);     //设置串口数据位8serial.setParity(QSerialPort::NoParity);    //无校验位serial.setStopBits(QSerialPort::OneStop);   //1位停止位serial.setFlowControl(QSerialPort::NoFlowControl);if(!serial.open(QIODevice::ReadWrite)){QMessageBox::critical(NULL, "提示", "串口打开失败");return;}qDebug() << "串口打开成功";this->ui->pushButton__Port_connect->setText("关闭");this->ui->pushButton_send->setEnabled(true);this->ui->pushButton__Port_Search->setDisabled(true);}else{serial.close();this->ui->pushButton__Port_connect->setText("连接");this->ui->pushButton_send->setDisabled(true);this->ui->pushButton__Port_Search->setEnabled(true);}
}

⑥数据显示

在private slots:中添加一个操函数,

void serialPort_readyRead();        //connect连接方式,串口接收的数据进行处理

然后再构造函数中进行绑定

connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);


收到信息后的call波函数

void MainWindow::serialPort_readyRead()
{QByteArray rx_buf= serial.readAll();;QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf);    //转换为中文格式ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加rx_buf_tmp.clear();rx_buf.clear();
}

然后添加cursorPositionChanged函数来实现滚动显示

void MainWindow::on_textEdit_receive_cursorPositionChanged()
{ui->textEdit_receive->moveCursor(QTextCursor::End);
}

最后完成的代码如下

main.c

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.c

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);// 初始化on_pushButton__Port_Search_clicked();ui->comboBox_Baud_rate->insertItem(0, "9600");ui->comboBox_Baud_rate->insertItem(1, "115200");ui->comboBox_Baud_rate->insertItem(2, "3000000");ui->comboBox_Baud_rate->insertItem(3, "自定义");ui->comboBox_Baud_rate->setCurrentIndex(1);ui->pushButton_send->setDisabled(true);}MainWindow::~MainWindow()
{delete ui;
}// 搜索串口
void MainWindow::on_pushButton__Port_Search_clicked()
{ui->comboBox_Serial->clear();// 清除以前的串口信息foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ui->comboBox_Serial->addItem(info.portName());}
}// 连接串口
void MainWindow::on_pushButton__Port_connect_clicked()
{if(this->ui->pushButton__Port_connect->text() == "连接"){serial.setPortName(ui->comboBox_Serial->currentText());serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());serial.setDataBits(QSerialPort::Data8);     //设置串口数据位8serial.setParity(QSerialPort::NoParity);    //无校验位serial.setStopBits(QSerialPort::OneStop);   //1位停止位serial.setFlowControl(QSerialPort::NoFlowControl);if(!serial.open(QIODevice::ReadWrite)){QMessageBox::critical(NULL, "提示", "串口打开失败");return;}qDebug() << "串口打开成功";this->ui->pushButton__Port_connect->setText("关闭");this->ui->pushButton_send->setEnabled(true);this->ui->pushButton__Port_Search->setDisabled(true);}else{serial.close();this->ui->pushButton__Port_connect->setText("连接");this->ui->pushButton_send->setDisabled(true);this->ui->pushButton__Port_Search->setEnabled(true);}}
void MainWindow::serialPort_readyRead()
{QByteArray rx_buf= serial.readAll();;QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf);    //转换为中文格式ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加rx_buf_tmp.clear();rx_buf.clear();
}void MainWindow::on_pushButton_clean_clicked()
{ui->textEdit_receive->clear();
}void MainWindow::on_pushButton_send_clicked()
{QString tx_buf = ui->textEdit_send->toPlainText();  //文本输入框的内容//获取多行输入框的数据并转换为UTF8格式QByteArray tx_buf_tmp = tx_buf.toLocal8Bit();   //转换为标准字符,支持中文if(ui->checkBox_Return->isChecked())tx_buf_tmp += "\r";if(ui->checkBox_New_Line->isChecked())tx_buf_tmp += "\n";qDebug()<<tx_buf_tmp;serial.write(tx_buf_tmp);     //把数据通过串口发送出去tx_buf.clear();
}void MainWindow::on_textEdit_receive_cursorPositionChanged()
{ui->textEdit_receive->moveCursor(QTextCursor::End);
}void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{if(this->ui->comboBox_Baud_rate->currentIndex() == 3){this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入this->ui->comboBox_Baud_rate->setEditable(true);}else{this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入this->ui->comboBox_Baud_rate->setEditable(false);}serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include <QMessageBox>
#include <QDebug>#include <QDir>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton__Port_Search_clicked();void on_pushButton__Port_connect_clicked();void serialPort_readyRead();        //connect连接方式,串口接收的数据进行处理void on_pushButton_clean_clicked();void on_pushButton_send_clicked();void on_textEdit_receive_cursorPositionChanged();void on_comboBox_Baud_rate_currentIndexChanged(int index);private:Ui::MainWindow *ui;QSerialPort serial;
};
#endif // MAINWINDOW_H

测试截图

代码工程以及release下载

使用QT简单写一个串口助手相关推荐

  1. qt 串口粘包_用Qt 5写一个串口收发桌面工具

    今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...

  2. 手把手教你写一个串口调试助手

    硬件攻城狮 2022-05-20 14:05 发表于广东 果果小师弟. 电子信息工程硕士在读,分享单片机.嵌入式linux.物联网等知识,致力于打造最硬核的嵌入式技术公众号. 摘要:前段时间发布了一个 ...

  3. 从零开始,教你写一个串口调试助手

    摘要:相信很多小伙伴都没接触过QT,如果想用QT写一个调试助手,首先是要会一点C++语法.只要能看得懂C++的代码,就能很快的写一个串口调试助手. 下面先推荐两个视频教程,感兴趣的可以看一看! 1.B ...

  4. 【 Qt编写一个串口助手】

    Qt编写一个串口助手 一.初始化 初始化需要注意的是,需要用到关于图形的qcustomplot 库,添加相关的.h和.cpp文件并在.pro文件下加上greaterThan(QT_MAJOR_VERS ...

  5. python写的串口助手并连接腾讯云服务器数据库

    结合上一期的基于pyqt5开发的图书管理系统UI(带登录页面)文章做一个此章节的补充.因为老师说需要结合数据库实现登录系统.于是我就想起了自己在腾讯云上买的一个服务器.因此经过百度查询大量的资料,功夫 ...

  6. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」

    作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...

  7. 利用Html,Css,javaScript简单写一个计算一天秒的倒计时

    利用Html,Css,javaScript简单写一个计算一天还剩多少秒的倒计时页面 代码我放下面,不多,就是我那个背景图我没有用精灵图,主要拼接太麻烦了,我直接img了,然后display:none; ...

  8. C#编写一个串口助手上位机软件

    对于工程师来说,串口助手可以说是必不可少的一个工具,一个好的串口助手可以大大方便我们的研发调试.网上串口助手很多,如果能够根据自己需要做一个合适的串口助手,那么既能方便自己,也能掌握上位机的开发,对于 ...

  9. Qt小项目之串口助手控制LED

    最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开发板上的两个LED. 主要功能: 启动 ...

  10. 用lisp编写串口助手源代码_实战用python来写个串口助手--界面篇

    1.python的图形化界面库有很多选择,自带的Tkinter.大名鼎鼎的wxpython,还有pyqt.从使用角度来说,pyqt5是一个很好的选择,所以之后的python的图形化界面编程都将使用py ...

最新文章

  1. DTCC:数据库安全重点在数据拷贝过程中
  2. VTK:IO之ImageReader2Factory
  3. 教你打入clr内部: 配置windows上的windbg,linux上的lldb
  4. 【2017年第1期】基于外卖物流配送大数据的调度系统
  5. python encodings模块_python-ImportError:没有名为“ encodings”的模块
  6. LeetCode刷题系列(二)二分查找、二叉排序树 的应用
  7. 蚂蚁移动开发平台 mPaaS 3.0 智能化 + 生态化 1
  8. 移动支付变巨头掘金地,银盒子手握SaaS成新宠
  9. Matlab textscan
  10. 电路分析:运放和三极管组成的恒流源电路
  11. 如何提高迅雷下载速度
  12. 软件测试周刊(第15期):将军赶路 不追小兔
  13. http://trans.godict.com/index.php
  14. “互联网+”拯救了星巴克,出路是“第四空间
  15. 密码格式 数字+字母
  16. Python技法-序列拆分
  17. 数据库设计之商品表分析1
  18. android animator
  19. LRU算法(JAVA实现)
  20. vue-seamless-scroll 使用

热门文章

  1. IDEA:Cannot determine Java VM executable in selected JDK
  2. Hive教程(一) Hive入门教程
  3. JavaWeb实现的超市收银、基于SSM+mysql的 vue便利店收银管理系统实现【文档】【代码过程】
  4. 网吧服务器是起什么作用的,网吧服务器的用途是什么?
  5. python爬虫学习教程,短短25行代码批量下载豆瓣妹子图片
  6. 智能网联汽车测试场景数据车载采集平台搭建要求及方法
  7. 计算机win键是哪里,键盘Win键在哪里
  8. MyEclipse 8.5可用的序列号
  9. DotNetBar2使用实例(引用方法)
  10. 手势解锁java后端设计_自己定义九宫格手势解锁