串口的使用基本是所有嵌入式开发中用得最多,使用最为普遍的。QT编写window界面程序非常便利,利用QT完成串口的控制,具有非常高的价值。而网上常见的串口是直接在主线程中接收数据,虽然也能使用。但若接收的数据量过大,且数据处理非常复杂,则会卡死界面线程使得无法响应鼠标和键盘事件,这是不允许的。因此本文通过多线程的方式接收串口的数据,可以有效防止界面的卡死。
前言:使用串口有多种方式:第一种,开闭串口和接收数据都在主界面线程中进行,数据量小还可以,数据量一大直接卡死;第二种,开闭串口和接收数据都在子线程中进行,主界面不会卡死,数据也能正常接收,但是线程中串口类不安全;第三种,开闭串口在主线程中进行,接受数据和解析数据在子线程中进行。本文也是这种方式。
本文的示例代码见咸鱼:
本文项目代码运行环境如下,代码界面和源代码链接在末尾:
1.使用多线程技术,串口在主线程开闭,在子线程中接收数据;
2.定时刷新可用串口;
3.定时检测选中的当前串口状态,通过指示灯指示状态(绿色开启,红色关闭);
4.默认数据流控制无,也可修改;
5.串口打开错误会提醒;
6.通过全局变量共享线程间数据;
QT自带串口类,因此使用非常简单。只需在pro文件中添加串口库,在使用前包含串口类。
同样,QT也有线程类。使用时包含线程类库。
头文件:
#include
主界面头文件中包含线程对象。
初始化线程:
开启和关闭线程:
新建子线程类:
防止子线程运算事件过长导致无法响应主界面鼠标点击等事件:
打开和关闭串口操作在主界面线程中,根据前面串口操作的讲解就能完成。但若要子线程中完成串口数据的接收,需要将串口类指针传入子线程,这里使用信号与槽机制完成,亲测可用,如有更好的方法,请留言给我!
包含QMessageBox的头文件,和Qpushbutton的头文件。
首先包含定时器类QTime。