QT 串口调试助手(串口编程代码详解)

目录

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   

  1. QT += core gui serialport
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. CONFIG += c++11
  4. # The following define makes your compiler emit warnings if you use
  5. # any Qt feature that has been marked deprecated (the exact warnings
  6. # depend on your compiler). Please consult the documentation of the
  7. # deprecated API in order to know how to port your code away from it.
  8. DEFINES += QT_DEPRECATED_WARNINGS
  9. # You can also make your code fail to compile if it uses deprecated APIs.
  10. # In order to do so, uncomment the following line.
  11. # You can also select to disable deprecated APIs only up to a certain version of Qt.
  12. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
  13. SOURCES += \
  14. main.cpp \
  15. serial.cpp
  16. HEADERS += \
  17. serial.h
  18. FORMS += \
  19. serial.ui
  20. RC_ICONS = system.ico
  21. # Default rules for deployment.
  22. qnx: target.path = /tmp/$${TARGET}/bin
  23. else: unix:!android: target.path = /opt/$${TARGET}/bin
  24. !isEmpty(target.path): INSTALLS += target

2.3 设计布局 serial.ui

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

  1. #ifndef SERIAL_H
  2. #define SERIAL_H
  3. #include <QMainWindow>
  4. /*-------------user-------------------*/
  5. /*---port--*/
  6. #include <QSerialPort>
  7. #include <QSerialPortInfo>
  8. /*---QString--*/
  9. #include <QString>
  10. /*---QDateTime--*/
  11. #include <QDateTime>
  12. /*---QTimer--*/
  13. #include <QTimer>
  14. /*---QDebug--*/
  15. #include <QDebug>
  16. #define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"
  17. /* -----------------------------------*/
  18. QT_BEGIN_NAMESPACE
  19. namespace Ui { class Serial; }
  20. QT_END_NAMESPACE
  21. class Serial : public QMainWindow
  22. {
  23. Q_OBJECT
  24. public:
  25. Serial(QWidget *parent = nullptr);
  26. ~Serial();
  27. signals: //自定义信号
  28. //发送使能信号
  29. void my_send_signals(bool);
  30. private slots: //自定义槽函数
  31. //检测通讯端口槽函数
  32. void btn_serial_check(bool);
  33. //打开选择端口槽函数
  34. void btn_open_port(bool);
  35. //关闭选择端口槽函数
  36. void btn_close_port(bool);
  37. //发送数据槽函数
  38. void btn_send_data(bool);
  39. //接收数据槽函数
  40. void receive_data(void);
  41. //清空接收槽函数
  42. void btn_clear_rev(bool);
  43. //自动发送复选框槽函数
  44. void on_checkBox_stateChanged(int arg1);
  45. private:
  46. Ui::Serial *ui;
  47. /*--------funtion---------------------*/
  48. //用户系统初始化
  49. void system_init();
  50. //字符串转16进制
  51. QByteArray QString2Hex(QString str);
  52. //字符转16进制
  53. char ConvertHexChar(char ch);
  54. /*--------variable--------------------*/
  55. //串口全局类声明
  56. QSerialPort global_port;
  57. //自动发送定时器声明
  58. QTimer *timer;
  59. };
  60. #endif // SERIAL_H

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

  1. #include "serial.h"
  2. #include "ui_serial.h"
  3. Serial::Serial(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::Serial)
  6. {
  7. ui->setupUi(this);
  8. /*----------user-----------*/
  9. //init 用户系统初始化
  10. system_init();
  11. }
  12. Serial::~Serial()
  13. {
  14. delete ui;
  15. }
  16. /*---------------------------------------------------------------------
  17. * funtion
  18. * --------------------------------------------------------------------*/
  19. //用户系统初始化
  20. void Serial::system_init()
  21. {
  22. //port conifg
  23. ui->cmd_port_name->clear();
  24. //通过QSerialPortInfo查找可用串口
  25. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  26. {
  27. //将可用串口添加到端口显示框
  28. ui->cmd_port_name->addItem(info.portName());
  29. }
  30. //设置串口状态标签为红色 表示未连接状态
  31. ui->lab_status->setStyleSheet("color:red");
  32. //statusBar 状态栏显示端口状态 未连接
  33. QString sm = "%1 CLOSED";
  34. QString status = sm.arg(ui->cmd_port_name->currentText());
  35. ui->statusBar->showMessage(status);
  36. ui->statusBar->setStyleSheet("color:red");
  37. //timer 自动发送
  38. timer = new QTimer(this);
  39. connect(timer,&QTimer::timeout,[=](){
  40. emit my_send_signals(true); //触发发送信号
  41. });
  42. //connect
  43. //check port 检测通讯端口
  44. connect(ui->btn_serial,&QPushButton::clicked,this,&Serial::btn_serial_check);
  45. //open port 打开选择端口
  46. connect(ui->btn_open,&QPushButton::clicked,this,&Serial::btn_open_port);
  47. //close port 关闭选择端口
  48. connect(ui->btn_close,&QPushButton::clicked,this,&Serial::btn_close_port);
  49. //send data 发送按钮 触发发送信号
  50. connect(ui->btn_send,&QPushButton::clicked,[=](){
  51. emit my_send_signals(true);
  52. });
  53. //发送信号 发送槽函数
  54. connect(this,&Serial::my_send_signals,this,&Serial::btn_send_data);
  55. //receive data 串口数据接收完触发更新添加显示接收文本框
  56. connect(&global_port,&QSerialPort::readyRead,this,&Serial::receive_data);
  57. //clear recevie 清除接收文本框的内容
  58. connect(ui->btn_clear,&QPushButton::clicked,this,&Serial::btn_clear_rev);
  59. }
  60. //字符串转16进制
  61. QByteArray Serial::QString2Hex(QString str)
  62. {
  63. QByteArray senddata;
  64. int hexdata,lowhexdata;
  65. int hexdatalen = 0;
  66. int len = str.length();
  67. senddata.resize(len/2);
  68. char lstr,hstr;
  69. for(int i=0; i<len; )
  70. {
  71. hstr=str[i].toLatin1();
  72. if(hstr == ' ')
  73. {
  74. i++;
  75. continue;
  76. }
  77. i++;
  78. if(i >= len)
  79. break;
  80. lstr = str[i].toLatin1();
  81. hexdata = ConvertHexChar(hstr);
  82. lowhexdata = ConvertHexChar(lstr);
  83. if((hexdata == 16) || (lowhexdata == 16))
  84. break;
  85. else
  86. hexdata = hexdata*16+lowhexdata;
  87. i++;
  88. senddata[hexdatalen] = (char)hexdata;
  89. hexdatalen++;
  90. }
  91. senddata.resize(hexdatalen);
  92. return senddata;
  93. }
  94. //字符转16进制
  95. char Serial::ConvertHexChar(char ch)
  96. {
  97. if((ch >= '0') && (ch <= '9'))
  98. return ch-0x30;
  99. else if((ch >= 'A') && (ch <= 'F'))
  100. return ch-'A'+10;
  101. else if((ch >= 'a') && (ch <= 'f'))
  102. return ch-'a'+10;
  103. else return (-1);
  104. }
  105. /*---------------------------------------------------------------------
  106. * slots
  107. * --------------------------------------------------------------------*/
  108. //检测通讯端口槽函数
  109. void Serial::btn_serial_check(bool)
  110. {
  111. ui->cmd_port_name->clear();
  112. //通过QSerialPortInfo查找可用串口
  113. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  114. {
  115. ui->cmd_port_name->addItem(info.portName());
  116. }
  117. }
  118. //打开选择端口槽函数
  119. void Serial::btn_open_port(bool)
  120. {
  121. //port name 设置端口
  122. global_port.setPortName(ui->cmd_port_name->currentText());
  123. //baud rate 设置波特率
  124. global_port.setBaudRate(ui->cmd_baud_rate->currentText().toInt());
  125. //parity 设置校验位
  126. switch (ui->cmd_parity->currentIndex()) {
  127. case 0: //无校验
  128. global_port.setParity(QSerialPort::NoParity);
  129. break;
  130. case 1: //偶校验
  131. global_port.setParity(QSerialPort::EvenParity);
  132. break;
  133. default: //奇校验
  134. global_port.setParity(QSerialPort::OddParity);
  135. break;
  136. }
  137. //data bits 设置数据位
  138. switch (ui->cmd_data_bits->currentText().toInt()) {
  139. case 8:
  140. global_port.setDataBits(QSerialPort::Data8);
  141. break;
  142. case 7:
  143. global_port.setDataBits(QSerialPort::Data7);
  144. break;
  145. case 6:
  146. global_port.setDataBits(QSerialPort::Data6);
  147. break;
  148. default:
  149. global_port.setDataBits(QSerialPort::Data5);
  150. break;
  151. }
  152. //stop bits 设置停止位
  153. switch (ui->cmd_stop_bits->currentIndex()) {
  154. case 0:
  155. global_port.setStopBits(QSerialPort::OneStop);
  156. break;
  157. case 1:
  158. global_port.setStopBits(QSerialPort::OneAndHalfStop);
  159. break;
  160. default:
  161. global_port.setStopBits(QSerialPort::TwoStop);
  162. break;
  163. }
  164. //port open 打开选择端口
  165. bool ret = global_port.open(QIODevice::ReadWrite);
  166. if(ret){
  167. //打开成功更新状态
  168. ui->lab_status->setText("Connected");
  169. //设置串口状态标签为绿色 表示已连接状态
  170. ui->lab_status->setStyleSheet("color:green");
  171. //statusBar 状态栏显示端口状态
  172. QString sm = "%1 OPENED, %2, 8, NONE, 1";
  173. QString status = sm.arg(global_port.portName()).arg(global_port.baudRate());
  174. ui->statusBar->showMessage(status);
  175. ui->statusBar->setStyleSheet("color:green");
  176. }
  177. }
  178. //关闭选择端口槽函数
  179. void Serial::btn_close_port(bool)
  180. {
  181. global_port.close();
  182. //关闭端口后显示状态
  183. ui->lab_status->setText("DisConnected");
  184. ui->lab_status->setStyleSheet("color:red");
  185. //statusBar 状态栏显示端口状态
  186. QString sm = "%1 CLOSED";
  187. QString status = sm.arg(global_port.portName());
  188. ui->statusBar->showMessage(status);
  189. ui->statusBar->setStyleSheet("color:red");
  190. }
  191. //发送数据槽函数
  192. void Serial::btn_send_data(bool)
  193. {
  194. QString data = ui->pte_send->toPlainText();
  195. QByteArray array;
  196. //Hex复选框
  197. if(ui->chk_send_hex->checkState() == Qt::Checked){
  198. array = QString2Hex(data); //HEX 16进制
  199. }else{
  200. array = data.toLatin1(); //ASCII
  201. }
  202. global_port.write(array); //发送数据
  203. }
  204. //接收数据槽函数
  205. void Serial::receive_data(void)
  206. {
  207. QByteArray array = global_port.readAll();
  208. QString str_rev;
  209. if(ui->chk_rev_hex->checkState() == Qt::Checked){ //HEX 16进制
  210. if(ui->chk_rev_line->checkState() == Qt::Checked){ //自动换行
  211. if(ui->chk_rev_time->checkState() == Qt::Checked){ //显示时间
  212. //获取当前系统时间
  213. QDateTime nowtime = QDateTime::currentDateTime();
  214. //时间转换为字符串格式
  215. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  216. //加上接收数据 转换为16进制并空格分开 接收数据换行
  217. str_rev += QString(array.toHex(' ').toUpper().append(' ')).append("\r\n");
  218. }else{
  219. str_rev = QString(array.toHex(' ').toUpper().append(' ')).append("\r\n");
  220. }
  221. }else{
  222. str_rev = QString(array.toHex(' ').toUpper().append(' '));
  223. }
  224. }else{
  225. if(ui->chk_rev_line->checkState() == Qt::Checked){
  226. if(ui->chk_rev_time->checkState() == Qt::Checked){
  227. QDateTime nowtime = QDateTime::currentDateTime();
  228. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  229. str_rev += QString(array).append("\r\n");
  230. }else{
  231. str_rev = QString(array).append("\r\n");
  232. }
  233. }else{
  234. str_rev = QString(array);
  235. }
  236. }
  237. ui->pte_rcv->insertPlainText(str_rev);
  238. }
  239. //清空接收文本框槽函数
  240. void Serial::btn_clear_rev(bool)
  241. {
  242. ui->pte_rcv->clear();
  243. }
  244. //自动触发复选框 启动定时器和停止定时器
  245. void Serial::on_checkBox_stateChanged(int arg1)
  246. {
  247. if(arg1){
  248. timer->start(ui->spinBox->value()); //启动定时器
  249. }else{
  250. timer->stop(); //停止定时器
  251. }
  252. }

2.6 主函数入口 main.cpp

  1. #include "serial.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. Serial w;
  7. w.show();
  8. return a.exec();
  9. }

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇