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 ...
随机推荐
- 一文总结 C++ 常量表达式、constexpr 和 const
TLDR 修饰变量的时候,可以把 constexpr 对象当作加强版的 const 对象:const 对象表明值不会改变,但不一定能够在编译期取得结果:constexpr 对象不仅值不会改变,而且保证 ...
- RedHat5 安装中文输入法
为了学习linux命令,虚拟机里搞了个RedHat 5.4 .下面是安装中文输入法过程: 1.下载并安装小企鹅输入法 fcitx-3.0.0-1.i386.rpm 2.安装后执行以下命令: # cd ...
- spring源码学习之设计模式
目录 1.策略模式 2.观察者模式 3.装饰者模式 4.工厂模式 工厂方法模式 抽象工厂模式 工厂方法和抽象工厂的异同 5.单例模式 6.适配器模式与外观模式 适配器模式 外观模式 7.模板方法模式 ...
- python中的泛型使用TypeVar
引入为什么需要TypeVar PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分.通过精巧的元编程技术,让类 支持[]运算不成问题.但是方括号内的T变量必须在某处定义,否则要 ...
- 参数替换xargs
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔为参数 示例: 创建10个用户 echo user{ ...
- 最新最简单安装龙蜥操作系统centos8
下载 https://openanolis.cn/download 我用的是稳定版本 Anolis OS8.2QU1 安装(vm用的15.5pro) 关键点 进去后,输入命令 ip a // 查看ip ...
- Django关于StreamingHttpResponse与FileResponse响应文件或视频的下载请求
StreamingHttpResponse from django.http import StreamingHttpResponse StreamingHttpResponse(streaming_ ...
- 基于java的学生信息管理系统
开发说明:使用数组集合存储临时数据,实现学生信息管理系统,实现的功能有管理员的注册.登陆.增加学生信息.删除学生信息.查询学生信息.修改学生信息.学生信息列表 登陆注册界面 系统首页界面 增加 删除 ...
- Java 重写引入
1 package com.bytezero.override; 2 /* 3 * 方法的重新(override/overwrite) 4 * 5 * 1.重写:子类继承父类以后,可以对父类中同名同参 ...
- DOSBox0.74使用Debug时p命令报错
环境 操作系统:Windows 10 DOSBox 0.74 DEBUG.EXE 从 Windows XP 或其他复制到的DOSBox下 问题 在学习到 王爽的<汇编语言>时,第 4章,第 ...