QT 防止界面卡死(多线程串口使用)

串口的使用基本是所有嵌入式开发中用得最多,使用最为普遍的。QT编写window界面程序非常便利,利用QT完成串口的控制,具有非常高的价值。而网上常见的串口是直接在主线程中接收数据,虽然也能使用。但若接收的数据量过大,且数据处理非常复杂,则会卡死界面线程使得无法响应鼠标和键盘事件,这是不允许的。因此本文通过多线程的方式接收串口的数据,可以有效防止界面的卡死。

前言:使用串口有多种方式:第一种,开闭串口和接收数据都在主界面线程中进行,数据量小还可以,数据量一大直接卡死;第二种,开闭串口和接收数据都在子线程中进行,主界面不会卡死,数据也能正常接收,但是线程中串口类不安全;第三种,开闭串口在主线程中进行,接受数据和解析数据在子线程中进行。本文也是这种方式。

本文项目代码运行环境如下,代码界面和源代码链接在末尾:

代码特点:

1.使用多线程技术,串口在主线程开闭,在子线程中接收数据;

2.定时刷新可用串口;

3.定时检测选中的当前串口状态,通过指示灯指示状态(绿色开启,红色关闭);

4.默认数据流控制无,也可修改;

5.串口打开错误会提醒;

6.通过全局变量共享线程间数据;

1.使用串口类

QT自带串口类,因此使用非常简单。只需在pro文件中添加串口库,在使用前包含串口类。

2.新建线程

同样,QT也有线程类。使用时包含线程类库。
头文件:
#include <QThread>

主界面头文件中包含线程对象。

初始化线程:

开启和关闭线程:

新建子线程类:

防止子线程运算事件过长导致无法响应主界面鼠标点击等事件:

3.串口指针传入子线程中

打开和关闭串口操作在主界面线程中,根据前面串口操作的讲解就能完成。但若要子线程中完成串口数据的接收,需要将串口类指针传入子线程,这里使用信号与槽机制完成,亲测可用,如有更好的方法,请留言给我!

4.错误信息提示框

包含QMessageBox的头文件,和Qpushbutton的头文件。

5.定时查看串口状态

首先包含定时器类QTime。

6.程序界面

串口程序试用:

代码链接:https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=599323286219&ut_sk=1.AAhiIP37iQwDANlHHj81FWR6_21407387_1563844255781.Copy.detail.599323286219.1030106470&forceFlush=1

发布了70 篇原创文章 · 获赞 48 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/kissgoodbye2012/article/details/96348923