QT之串口通信和多线程处理
前言
使用QT的多线程编程,完成串口通信助手的设计。
实施
Qt5下的串口编程
使用QT5.12中自带的QSerialPort和QSerialPortInf的类实现对串口硬件的访问,通过对类的方法进行操作,完成整个串口的控制。整个操作基于类的实例,能够快速部署。这里需要明确层次的概念。串口类,提供了整个串口通信需要的方法,可以直接用于串口的使用。打开串口,即指示该类打开底层串口缓存区,建立连接,实现数据的访问。读取数据,在打开串口的条件下,对缓存区的数据进行操作,确保可以得到正确的数据。这三个层次就是串口编程的基本概念。为了降低数据处理对整个界面的影响,将数据通过变量传递给多线程下的数据处理模块。
串口部分的功能设计
//采用指针分配空间的方法实现类的操作
void DialogUart::on_btnUartOpen_clicked()
{
serial = new QSerialPort;
qDebug()<<"uart is open";
}
void DialogUart::on_btnUartClose_clicked()
{
delete serial;
qDebug()<<"uart is close";
}
//采用函数的方法实现串口配置及打开
void DialogUart::on_btnConnect_clicked()
{
//设置串口名
serial->setPortName("COM1");
//设置波特率
serial->setBaudRate(QSerialPort::Baud9600);
//设置数据位数
serial->setDataBits(QSerialPort::Data8);
//设置奇偶校验
serial->setParity(QSerialPort::NoParity);
//设置停止位
serial->setStopBits(QSerialPort::OneStop);
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
serial->open(QIODevice::ReadWrite);
} void DialogUart::on_btnDisConnect_clicked()
{
serial->close();
} //采用按键控制接收数据(仅用于测试,实际使用中应使用信号触发,防止读取多余的数据)
void DialogUart::on_readAll_clicked()
{
QByteArray buf_read;
buf_read = serial->readAll();
QString recv = ui->readText->toPlainText();
recv += QString(buf_read);
ui->readText->clear();
ui->readText->append(recv);
}
//采用按键控制写入
void DialogUart::on_writeAll_clicked()
{
QByteArray buf_write;
buf_write = ui->writeText->text().toUtf8();
serial->write(buf_write);
}
整个控制还是比较清晰的。这里基本上满足了串口调试的常用需求,但是缺少一些控制界面。这些通过控件关联到参数即可。

在这个简单的串口控制的基础上,增加一些多线程控制的功能,用于实现一些数据的自动化处理。
多线程部分的编程
这里多线程采用简单的继承QThread的方法,利用run函数的重构进行部分复杂功能的后台运行。根据需求,这里采用正则匹配的方法对串口自动接收的数据进行分割,确保串行数据可以转化为预期的并行数据。数据通过文件在不同的界面之间进行传输,暂时不协调,使用按钮模拟流程。
QFile fil(QDir::currentPath()+".txt");
fil.open(QIODevice::ReadOnly);
char buf[3];
qint64 addr;
qint64 length;
QString buf_exp;
QRegExp exp("[0-9a-fA-F]");
addr=0;
while(!m_toStop)
{
fil.seek(addr);
length = fil.read(buf,sizeof (buf));
buf_exp = QString::fromLocal8Bit(buf);
if(! exp.indexIn(buf_exp))
{
qDebug()<<buf_exp;
addr=addr+length;
}
else
{
qDebug()<<"error";
addr=addr+1;
}
if(addr>=fil.size())
{
fil.close();
m_toStop = true;
}
}
重构的run函数可以用于持续读取和匹配字符函数。本段代码展示了单位宽度正则匹配字符的简易操作方法,主要用于记录和演示。
结果
初步验证了使用串口类完成数据通信和使用多线程完成通信后的数据匹配处理的操作,为下一步的QT增加处理模型提供了解决方法。
附件
QT之串口通信和多线程处理的更多相关文章
- Qt实现串口通信总结
Qt实现串口通信总结 注意: Qt5发布之前,Qt实现串口通信一般是采用第三方类库qextserialport.Qt5发布后自带了QtSerialPort 能够支持串口通信. 1.Qextserial ...
- Qt编写串口通信程序全程图文解说
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...
- 转:Qt编写串口通信程序全程图文讲解
转载:http://blog.csdn.net/yafeilinux/article/details/4717706 作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...
- Qt编写串口通信程序全程图文讲解 .
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...
- 【转】Qt编写串口通信程序全程图文讲解
本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...
- Qt串口通信专题教程
查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...
- QT串口通信编程
QT串口编程 文件夹目录结构如下图所示 设计的示例界面如下图所示 首先在项目文件里面添加一句 QT += serialport SerialPortDemo.pro文件如下: #----------- ...
- 串口通信中,QString 、QByteArray 转化需要注意的问题
在做串口通信的时候,其中犯了一个错误.在此记录一下:QT中串口通信接到收据和发送数据的接口如下: QByteArray QIODevice::readAll()//接受数据 qint64 QIODev ...
- Qt 串口通信
在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台 QextSerialPort QT C++ Win/Linux http://sourceforge. ...
- QT 串口通信 数据16进制发送
在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray ...
随机推荐
- Innodb存储引擎之锁
目录 一.概述 二.lock 与 latch 三.Innodb存储引擎中的锁 锁 一致性非锁定读 一致性锁定读 自增长与锁 外键与锁 四.锁的算法 锁的算法 Phantom Problem 幻读问题 ...
- 【Android 逆向】【ARM汇编】 事前更新和事后更新
1. 事前更新,事后更新,不更新 不更新 ldr R4, [R1, R2, lsl #1] 相当于 R4 = *(R1 + R2 << 2^1) 之后 R1.R2的值时没有变化的 事前更新 ...
- IntelliJ IDE使用指南
下载IDEA 注释模板 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}; ...
- Hi3516开发笔记(九):在QtCreator开发环境中引入海思sdk的bsp包,运行显示Qt界面
前言 之前启动Qt界面程序失败了,是因为需要引入HiSDK的BSP中的HiMPP,并对HiMPP进行初始化设置. 在sdk中查询海思SDK头文件和库 在Qt中调用海思BSP 在 ...
- Vue框架设计:性能权衡的艺术
"框架设计里到处都体现了权衡的艺术." 当我们设计一个框架的时候,框架本身的各个模块之间并不是相互独立的,而是相互关联.相互制约的.因此作为框架设计者,一定要对框架的定位和方向拥有 ...
- context讲解
context包 context包介绍 在go语言中,每个独立调用一般都会被单独的协程处理.但在处理一个请求时,往往可能需要在多个协程之间进行信息传递,甚至包括一层层地递进顺序传递,而且这种信息往 ...
- 【Azure Developer】Github Action使用Azure/login@v1插件登录遇见错误的替代方案
问题描述 在使用 Github Action - Azure/login@v1 的插件时候,登录中国区Azure遇见了问题. Login YAML 内容: - name: 'Login via A ...
- 【Azure 事件中心】关闭或开启Azure Event Hub SDK中的日志输出
问题描述 使用Azure Event Hub的Java SDK 作为消费端消费消息,集成在项目中后,发现大量日志产生,并且都是Debug 级别日志,如何来关闭这部分日志输出呢? import com. ...
- 【Azure 媒体服务】在Azure Media Service门户中使用HLS模式传输视频流,播放视频步骤
问题描述 如何在Azure Media Service门户中使用HLS模式传输视频流,播放视频步骤 问题解决 第一步:在 Media Service 这边点击资产.上传本地视频资源作为Media Se ...
- PHP项目&MVC文件安全&上传&包含&下载&删除&读取等
文件安全-文件包含-动态调试-xhcms 1.安装好xhcms,查看index.php文件. 2.存在include关键字,可以存在文件包含漏洞.看上面代码的逻辑,对r的传参添加魔术引号,如果r没有值 ...