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 ...
随机推荐
- Laravel入坑指南(8)——控制台程序
我们知道,php代码不仅可以用web的形式对外提供服务,同时也可以在命令行下执行. 对于原生的php来说,假设我们有一个php文件,名为Command.php,如果想要在控制台下执行这个文件,那么我们 ...
- 全栈式测试平台RunnerGo核心功能模块-接口管理
全栈式测试平台RunnerGo相对于市面上其他性能测试产品来说更简单,它不用其他相关配件,天然支持分布式,有单独的机器做分布式的负载均衡,自有一套智能算法算压力机的配置从而平均分配,并从场景链路的流 ...
- WriteFile 奇怪的现象
项目中有个需求是要对文本内容检索并重写,我们使用的是 WriteFile 覆盖旧的文本内容 最小示例: #include <Windows.h> #include <iostream ...
- SBI信息反馈法
https://baijiahao.baidu.com/s?id=1605128367255769158&wfr=spider&for=pc
- xcode真机运行包添加(更新到15.4)
今天给真机装包,提示xcode版本低不能安装,电脑内存有些不足,xcode更新不了,这时候了解到xcode可以单独添加开发包\(^o^)/~ 1.下载 链接: https://pan.baidu.co ...
- SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)
前言 为了方便新加入团队的员工熟悉团队协作开发. 为了将好东西整理分享给有需要的网友. 将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发. 本文档培训员工对于 ...
- 【转载】重装系统小贴士:ssh、vscode免密登录
ssh安装 apt install openssh-server 然后到cd /etc/ssh下找sshd_config文件,打开把允许远程root登录的选项改为yes 重启ssh服务:/etc/in ...
- React时间转换为具体的年月日上午下午
export default class index extends Component { constructor() { super(); this.state = { date: new Dat ...
- error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
起因:自己顶不住好奇心,升级了Mac系统.界面看起来,真香!然鹅用起来其实也挺香,就是有些开发常用的竟然挂掉了,挂掉了. 最直观的就是Parallels Desktop , xcode , git,完 ...
- DataGear 制作全国和省级地图联动的数据可视化看板
DataGear看板的图表联动功能,使您可以轻松制作支持图表联动的全国地图.省级地图数据可视化看板. 首先,新建两个数据集. 第一个是各省指标数据集,将用于绘制全国指标图表,它的SQL语句如下所示: ...