目录

1 串口助手最终成品效果

1.1 串口功能描述

1.2 串口接收数据显示图

1.3 串口发送数据显示图

2 项目编程代码详解

2.1 项目框架

2.2 工程配置 serial.pro

2.3 设计布局 serial.ui

2.4 串口头文件 serial.h (包含详细注释)

2.5 串口源代码 serial.cpp(包含详细注释)

2.6 主函数入口 main.cpp

3 移植到ARM嵌入式Linux开发板

3.1 RS485接口的Modbus Poll 持续发送串口数据

3.2 ARM嵌入式Linux开发板 QT串口助手效果图

4 【QT】串口助手(优化升级)

4.1 【QT】串口助手(优化升级)

4.2【QT】串口助手(优化升级 详细注解) qt5_serial.zip


1 串口助手最终成品效果

1.1 串口功能描述

检测当前可用的通讯端口,如COM1、COM2、COM3、COM4等

配置端口号、波特率、数据位、校验位、停止位参数

串口当前状态,连接(打开)还是未连接(关闭)

  

发送默认是ASCII格式发送,可配置HEX 16进制格式,还有自动发送功能

接收默认是ASCII格式发送,可配置HEX 16进制格式,还有自动换行、显示接收时间功能

具有打开端口open、停止端口close、清空接收clear等功能

1.2 串口接收数据显示图

启动嵌入式Linux系统串口接收显示数据界面

1.3 串口发送数据显示图

输入 ifconfig 命令查看IP地址等信息界面

2 项目编程代码详解

2.1 项目框架

2.2 工程配置 serial.pro

注意:添加serialport,即     QT       += core gui serialport   

QT       += core gui serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \serial.cppHEADERS += \serial.hFORMS += \serial.uiRC_ICONS = system.ico# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.3 设计布局 serial.ui

2.4 串口头文件 serial.h (包含详细注释)

#ifndef SERIAL_H
#define SERIAL_H#include <QMainWindow>/*-------------user-------------------*/
/*---port--*/
#include <QSerialPort>
#include <QSerialPortInfo>
/*---QString--*/
#include <QString>
/*---QDateTime--*/
#include <QDateTime>
/*---QTimer--*/
#include <QTimer>
/*---QDebug--*/
#include <QDebug>
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"
/* -----------------------------------*/QT_BEGIN_NAMESPACE
namespace Ui { class Serial; }
QT_END_NAMESPACEclass Serial : public QMainWindow
{Q_OBJECTpublic:Serial(QWidget *parent = nullptr);~Serial();signals:    //自定义信号//发送使能信号void my_send_signals(bool);private slots:  //自定义槽函数//检测通讯端口槽函数void btn_serial_check(bool);//打开选择端口槽函数void btn_open_port(bool);//关闭选择端口槽函数void btn_close_port(bool);//发送数据槽函数void btn_send_data(bool);//接收数据槽函数void receive_data(void);//清空接收槽函数void btn_clear_rev(bool);//自动发送复选框槽函数void on_checkBox_stateChanged(int arg1);private:Ui::Serial *ui;/*--------funtion---------------------*///用户系统初始化void system_init();//字符串转16进制QByteArray QString2Hex(QString str);//字符转16进制char ConvertHexChar(char ch);/*--------variable--------------------*///串口全局类声明QSerialPort global_port;//自动发送定时器声明QTimer *timer;
};
#endif // SERIAL_H

2.5 串口源代码 serial.cpp(包含详细注释)

#include "serial.h"
#include "ui_serial.h"Serial::Serial(QWidget *parent): QMainWindow(parent), ui(new Ui::Serial)
{ui->setupUi(this);/*----------user-----------*///init 用户系统初始化system_init();
}Serial::~Serial()
{delete ui;
}/*---------------------------------------------------------------------*             funtion* --------------------------------------------------------------------*/
//用户系统初始化
void Serial::system_init()
{//port conifgui->cmd_port_name->clear();//通过QSerialPortInfo查找可用串口foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){//将可用串口添加到端口显示框ui->cmd_port_name->addItem(info.portName());}//设置串口状态标签为红色 表示未连接状态ui->lab_status->setStyleSheet("color:red");//statusBar 状态栏显示端口状态 未连接QString sm = "%1 CLOSED";QString status = sm.arg(ui->cmd_port_name->currentText());ui->statusBar->showMessage(status);ui->statusBar->setStyleSheet("color:red");//timer 自动发送timer = new QTimer(this);connect(timer,&QTimer::timeout,[=](){emit my_send_signals(true); //触发发送信号});//connect//check port 检测通讯端口connect(ui->btn_serial,&QPushButton::clicked,this,&Serial::btn_serial_check);//open port 打开选择端口connect(ui->btn_open,&QPushButton::clicked,this,&Serial::btn_open_port);//close port 关闭选择端口connect(ui->btn_close,&QPushButton::clicked,this,&Serial::btn_close_port);//send data 发送按钮 触发发送信号connect(ui->btn_send,&QPushButton::clicked,[=](){emit my_send_signals(true);});//发送信号   发送槽函数connect(this,&Serial::my_send_signals,this,&Serial::btn_send_data);//receive data 串口数据接收完触发更新添加显示接收文本框connect(&global_port,&QSerialPort::readyRead,this,&Serial::receive_data);//clear recevie 清除接收文本框的内容connect(ui->btn_clear,&QPushButton::clicked,this,&Serial::btn_clear_rev);}//字符串转16进制
QByteArray Serial::QString2Hex(QString str)
{QByteArray senddata;int hexdata,lowhexdata;int hexdatalen = 0;int len = str.length();senddata.resize(len/2);char lstr,hstr;for(int i=0; i<len; ){hstr=str[i].toLatin1();if(hstr == ' '){i++;continue;}i++;if(i >= len)break;lstr = str[i].toLatin1();hexdata = ConvertHexChar(hstr);lowhexdata = ConvertHexChar(lstr);if((hexdata == 16) || (lowhexdata == 16))break;elsehexdata = hexdata*16+lowhexdata;i++;senddata[hexdatalen] = (char)hexdata;hexdatalen++;}senddata.resize(hexdatalen);return senddata;
}
//字符转16进制
char Serial::ConvertHexChar(char ch)
{if((ch >= '0') && (ch <= '9'))return ch-0x30;else if((ch >= 'A') && (ch <= 'F'))return ch-'A'+10;else if((ch >= 'a') && (ch <= 'f'))return ch-'a'+10;else return (-1);
}/*---------------------------------------------------------------------*             slots* --------------------------------------------------------------------*/
//检测通讯端口槽函数
void Serial::btn_serial_check(bool)
{ui->cmd_port_name->clear();//通过QSerialPortInfo查找可用串口foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ui->cmd_port_name->addItem(info.portName());}
}//打开选择端口槽函数
void Serial::btn_open_port(bool)
{//port name 设置端口global_port.setPortName(ui->cmd_port_name->currentText());//baud rate 设置波特率global_port.setBaudRate(ui->cmd_baud_rate->currentText().toInt());//parity 设置校验位switch (ui->cmd_parity->currentIndex()) {case 0:     //无校验global_port.setParity(QSerialPort::NoParity);break;case 1:     //偶校验global_port.setParity(QSerialPort::EvenParity);break;default:    //奇校验global_port.setParity(QSerialPort::OddParity);break;}//data bits 设置数据位switch (ui->cmd_data_bits->currentText().toInt()) {case 8:global_port.setDataBits(QSerialPort::Data8);break;case 7:global_port.setDataBits(QSerialPort::Data7);break;case 6:global_port.setDataBits(QSerialPort::Data6);break;default:global_port.setDataBits(QSerialPort::Data5);break;}//stop bits 设置停止位switch (ui->cmd_stop_bits->currentIndex()) {case 0:global_port.setStopBits(QSerialPort::OneStop);break;case 1:global_port.setStopBits(QSerialPort::OneAndHalfStop);break;default:global_port.setStopBits(QSerialPort::TwoStop);break;}//port open 打开选择端口bool ret = global_port.open(QIODevice::ReadWrite);if(ret){//打开成功更新状态ui->lab_status->setText("Connected");//设置串口状态标签为绿色 表示已连接状态ui->lab_status->setStyleSheet("color:green");//statusBar 状态栏显示端口状态QString sm = "%1 OPENED, %2, 8, NONE, 1";QString status = sm.arg(global_port.portName()).arg(global_port.baudRate());ui->statusBar->showMessage(status);ui->statusBar->setStyleSheet("color:green");}
}//关闭选择端口槽函数
void Serial::btn_close_port(bool)
{global_port.close();//关闭端口后显示状态ui->lab_status->setText("DisConnected");ui->lab_status->setStyleSheet("color:red");//statusBar 状态栏显示端口状态QString sm = "%1 CLOSED";QString status = sm.arg(global_port.portName());ui->statusBar->showMessage(status);ui->statusBar->setStyleSheet("color:red");
}//发送数据槽函数
void Serial::btn_send_data(bool)
{QString data = ui->pte_send->toPlainText();QByteArray array;//Hex复选框if(ui->chk_send_hex->checkState() == Qt::Checked){array = QString2Hex(data);  //HEX 16进制}else{array = data.toLatin1();    //ASCII}global_port.write(array);   //发送数据
}//接收数据槽函数
void Serial::receive_data(void)
{QByteArray array = global_port.readAll();QString str_rev;if(ui->chk_rev_hex->checkState() == Qt::Checked){   //HEX 16进制if(ui->chk_rev_line->checkState() == Qt::Checked){  //自动换行if(ui->chk_rev_time->checkState() == Qt::Checked){  //显示时间//获取当前系统时间QDateTime nowtime = QDateTime::currentDateTime();//时间转换为字符串格式str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";//加上接收数据 转换为16进制并空格分开 接收数据换行str_rev += QString(array.toHex(' ').toUpper().append(' ')).append("\r\n");}else{str_rev = QString(array.toHex(' ').toUpper().append(' ')).append("\r\n");}}else{str_rev = QString(array.toHex(' ').toUpper().append(' '));}}else{if(ui->chk_rev_line->checkState() == Qt::Checked){if(ui->chk_rev_time->checkState() == Qt::Checked){QDateTime nowtime = QDateTime::currentDateTime();str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";str_rev += QString(array).append("\r\n");}else{str_rev = QString(array).append("\r\n");}}else{str_rev = QString(array);}}ui->pte_rcv->insertPlainText(str_rev);
}//清空接收文本框槽函数
void Serial::btn_clear_rev(bool)
{ui->pte_rcv->clear();
}//自动触发复选框  启动定时器和停止定时器
void Serial::on_checkBox_stateChanged(int arg1)
{if(arg1){timer->start(ui->spinBox->value()); //启动定时器}else{timer->stop();  //停止定时器}
}

2.6 主函数入口 main.cpp

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

3 移植到ARM嵌入式Linux开发板

参考移植博文:【ARM嵌入式Linux】正点原子I.MX6U-ALPHA的QT交叉编译环境搭建

3.1 RS485接口的Modbus Poll 持续发送串口数据

3.2 ARM嵌入式Linux开发板 QT串口助手效果图

4 【QT】串口助手(优化升级)

4.1 【QT】串口助手(优化升级)

4.2【QT】串口助手(优化升级 详细注解) qt5_serial.zip

【QT】串口调试助手(串口编程代码详解)相关推荐

  1. CSerialPort多线程串口编程工具详解

    1.前言 既然有了MSComm这种简单粗暴的控件,为什么还需要CSerialPort类?这是因为与前者相比,这个类在程序的发布上不需要加入其他的文件,而且CSerialPort提供给我们的函数都是开放 ...

  2. python程序编程代码大全,python编程代码详解

    大家好,本文将围绕python程序编程代码大全展开说明,python编程游戏代码是一个很多人都想弄明白的事情,想搞清楚python代码大全简单需要先了解以下几个事情. 1.python编程例子有哪些? ...

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

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

  4. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架

    1. 设计目的 使用Qt设计一款串口调试助手,具有自动扫描串口端口.列表端口硬件信息.16进制转换.收发数目统计.定时发送等功能.代码注释清晰,应用无内建缓存区,运行效率高,适合拿来学习和作为二次开发 ...

  5. 【Qt串口调试助手】1.3 - 重写ComboBox下拉框的鼠标点击事件,实现点击下拉框扫描可用串口

    由于ComboBox没有鼠标点击信号,所以如果想实现点击下拉框响应,需要重写ComboBox下拉框的鼠标点击事件.在点击事件中,添加扫描可用串口代码,实现点击下拉框时重新扫描串口.并且下拉框内容输出端 ...

  6. 【Qt串口调试助手】1.2 - 串口数据接收不发生换行,CH340 / CP2102 多硬件兼容

    上一篇提到:对串口接收的显示,使用的是当前位置插入+移动鼠标光标到末尾的方式.这种方法可以有效解决 串口数据接收发生换行的问题,并且解决 CH340 / CP2102 多硬件显示结果不一致的问题.那有 ...

  7. java一个方法排他调用_Java编程实现排他锁代码详解

    一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...

  8. Qt开发技术:QCharts(三)QCharts样条曲线图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108022984 各位读者,知识无穷而人力有穷 ...

  9. Qt开发技术:Q3D图表开发笔记(二):Q3DBar三维柱状图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130150728 各位读者,知识无穷而人力有穷,要么改需 ...

  10. Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130264470 各位读者,知识无穷而人力有穷,要么改需 ...

最新文章

  1. 属于窄带噪声的是热噪声_时钟201系列: 非相位噪声的情况 (第一篇)
  2. 第十四篇:有概率的上下文无关语法Probabilistic Context-Free Grammar
  3. 全领域涨点 | Evolving Attention在CV与NLP领域全面涨点
  4. 分布式id 实现方式
  5. 企业网络推广专员浅析如何通过企业网络推广的方式提升网站权重?
  6. 餐厅叫号语音包_在济宁,你知道这家粤菜餐厅吗?网友:简直太好吃了
  7. 山东大学计算机系统原理,山东大学计算机组成原理三套题汇总
  8. 2月份Web服务器份额:排名不变 仅Microsoft份额上扬
  9. 自然语言处理实践Task2
  10. js正则标志/g,/i,/m说明
  11. idea 关于2020maven home directory的路径
  12. python初体验(2)——面向对象篇
  13. JQ实现图片预览(轮播,放大缩小,拖拽,ajax请求,旋转)
  14. 网络翻译-利用有道接口
  15. 基于CIFAR100的VGG网络结构详解
  16. Matplotlib填图
  17. AE二次开发-获取图层的属性表
  18. 加拿大曼尼托巴大学计算机专业几年,2020年加拿大曼尼托巴大学毕业时间是几月...
  19. STM32—OLED显示屏
  20. 戴特科技丨数字化转型下的智造

热门文章

  1. python编写鸡兔同笼程序_编写程序,分享解鸡兔同笼问题? 用Python分享多笼鸡兔同笼...
  2. 罗永浩发声:我的努力很可能失败 但好产品一定要赢
  3. 微信指纹支付设置java_微信指纹支付怎么设置?微信指纹支付设置方法介绍
  4. 如何写好一个综述,以一个综述为例
  5. grep命令,sed命令和awk命令
  6. 从零开始学PCR技术(二):Taq DNA酶
  7. 皮尔逊相关系数的计算过程
  8. HDU-1212-Big Number【大数】
  9. MySQL时间分区案例
  10. python非参数检验