Qt开发小工具之三串口设备调试工具
liebian365 2024-10-17 13:59 30 浏览 0 评论
一、前言
这个为什么叫串口设备调试工具而不是串口调试工具,是因为这个工具比网络上的串口调试工具多出了一些真实需要的用来调试设备的功能,首先一点就是大部分的串口调试工具收到数据都是立即返回,这样的数据都是连着的,头一条数据和后一条数据头尾相连,对于调试着来说要看数据非常麻烦,而且在不断有数据过来时,要停下来看数据除非关闭串口,而不能在打开串口的时候看数据,因为不断有数据过来冲掉前面的数据显示,甚至有些还不能最大化等等情况,这个工具是根据将近四年的与硬件通信这块开发工具的切身实际需求量身定做的,还能模拟设备立即回复数据。之前很多QT开发的版本源码分成两套,一套在windows下编译,一套在linux下编译,甚至麻烦,虽然QT5.1之后的版本自带了串口通信类,本人测试过,貌似还有小问题,在快速收发数据时容易卡住,这次带来的源码不用做任何改动即可在多个平台编译。
二、项目环境
项目名称:串口设备调试工具
开发环境:WIN7+QT4.7+QT CREATOR2.8+MINGW
已编译通过测试平台:XP、Win7、ubuntu、tiny210
技术实现:通过第三方串口通信类,解析协议并作出处理
三、基本功能
1:支持16进制数据发送与接收。
2:支持windows下COM9以上的串口通信。
3:自动加载对应操作系统串口号。
4:实时显示收发数据字节大小以及串口状态。
四、高级功能
1:可自由管理需要发送的数据,每次只要从下拉框中选择数据即可,无需重新输入数据。
2:可模拟设备回复数据,需要在主界面开启模拟设备回复数据。当接收到设置好的指令时,立即回复设置的回复指令。例如指定收到0x16 0x00 0xFF 0x01需要回复0x16 0x00 0xFE 0x01,则只需要在SendData.txt中添加一条数据16 00 FF 01:16 00 FE 01即可。
3:可定时发送数据和保存数据到文本文件:,默认间隔5秒钟,可更改间隔时间。
4:在不断接收到大量数据时,可以暂停显示数据来查看具体数据,后台依然接收数据但不处理,无需关闭串口来查看已接收到的数据。
5:每次收到的数据都是完整的一条数据,而不是脱节的,做了延时处理。
6:一套源码随处编译,无需更改串口通信类,已在XP/WIN7/UBUNTU/ARMLINUX系统下成功编译并运行。
五、运行截图
六、开发步骤
第一步:布局好界面,控件命名好,建议用pascal命名法。
第二步:准备unix和windows串口通信第三方类qextserialport.h、qextserialport.cpp、qextserialport_global.h、qextserialport_p.h、qextserialport_unix.cpp、qextserialport_win.cpp。
第三步:初始化主界面,自动加载对应串口号波特率等信息。
第四步:采用定时器读取串口数据,其实也可以采用事件机制,在几大平台也测试通过事件来收数据也可以,但是在windows下在快速收发大量数据时候居然会卡住,同样的代码在linux表现很好,不明原因,后面采用定时器读取机制,问题就没有了。
void frmMain::ReadMyCom() { //这个判断尤为重要,否则的话直接延时再接收数据,空闲时和会出现高内存占用 if (myCom->bytesAvailable()<=0){return;} myHelper::Sleep(100);//延时100毫秒保证接收到的是一条完整的数据,而不是脱节的 QByteArray buffer=myCom->readAll(); if (IsShow) { if (IsHexReceive) { QString tempDataHex=myHelper::ByteArrayToHexStr(buffer); ui->txtDataHex->append(QString("接收:%1 时间:%2") .arg(tempDataHex) .arg(QTime::currentTime().toString("HH:mm:ss"))); if (IsDebug)//2013-8-6增加接收数据后转发数据,模拟设备 { foreach(QString tempData,SendDataList) { QStringList temp=tempData.split(';'); if (tempDataHex==temp[0]) { //这里没有跳出循环,有可能一条数据会对应多条数据需要转发 myCom->write(myHelper::HexStrToByteArray(temp[1])); } } } } else { QString tempDataNormal=QString(buffer); ui->txtDataHex->append(QString("接收:%1 时间:%2") .arg(tempDataNormal) .arg(QTime::currentTime().toString("HH:mm:ss"))); if (IsDebug)//2013-8-6增加接收数据后转发数据,模拟设备 { foreach(QString tempData,SendDataList) { QStringList temp=tempData.split(';'); if (tempDataNormal==temp[0]) { //这里没有跳出循环,有可能一条数据会对应多条数据需要转发 myCom->write(temp[1].toAscii()); } } } } ReceiveCount=ReceiveCount+buffer.size(); ui->labReceive->setText(QString("接收:%1 字节").arg(ReceiveCount)); } } void frmMain::WriteMyCom() { QString str=ui->txtSend->currentText(); if (str==""){ui->txtSend->setFocus();return;}//发送数据为空 if (!myCom->isOpen()) { return; }//串口没有打开 QByteArray outData=str.toAscii(); int size=outData.size(); if (IsHexSend)//转化为16进制发送 { outData=myHelper::HexStrToByteArray(str); size=outData.size(); myCom->write(outData); } else { size=outData.size(); myCom->write(outData); } ui->txtDataHex->append(QString("发送:%1 时间:%2") .arg(str) .arg(QTime::currentTime().toString("HH:mm:ss"))); SendCount=SendCount+size; ui->labSend->setText(QString("发送:%1 字节").arg(SendCount)); if (IsAutoClear) { ui->txtSend->setCurrentIndex(-1); ui->txtSend->setFocus(); } } void frmMain::SaveMyCom() { QString tempData=ui->txtDataHex->toPlainText(); if (tempData==""){return;}//如果没有内容则不保存 QDateTime now=QDateTime::currentDateTime(); QString name=now.toString("yyyyMMddHHmmss"); QString fileName=name+".txt"; QFile file(fileName); file.open(QFile::WriteOnly | QIODevice::Text); QTextStream out(&file); out<<tempData; file.close(); }
相关推荐
- 深度解密epoll 如何工作的?(epoll基本处理流程)
-
epoll...
- 大乐透第19082期:头奖开出7注1000万分落六地 奖池41亿元
-
2019年7月17日晚开奖的体彩超级大乐透第19082期开奖号码为:前区06、18、20、21、31,后区03、04。本期大乐透前区号码五区比为1:0:3:0:1,二区和四区号码没有给出。当期前区和值...
- 【开奖】4月27日周六:福彩、体彩(2021年4月27日体彩开奖结果)
-
4月27日开奖福彩3D第2019110期:61222选5第2019110期:0812202122排列3第19110期:303排列5第19110期:30305大乐透第19047期:0304...
- “红狒狒”落户哈尔滨铁路局(哈尔滨铁路红肠)
-
这几天,“红人”“红狒狒”在牡丹江机务段可引起了不小的轰动,众粉丝争相与其拍照留念,在该段人气爆棚!“红狒狒”到底何许人也?“红狒狒”,中文名:和谐3D型电力机车;绰号:红狒狒、番茄;制造商:大连机...
- 2D、3D、2.5D,做游戏还是搞噱头?玩家都晕了
-
前言游戏类型就像某种潮流,一种流行罢,另一种接棒成为主流。前两年的新作大多以“开放世界”为标签,在追求纯沙盒的过程中打造出一些细致的分类,比如说“类GTA沙盒”。诚然,纯碎的沙盒游戏并不多见,业内只有...
- 《战神4》PC版宣传片发布 GTX 1070即可60帧畅玩
-
在今年10月的时候索尼PlayStation官方正式宣布圣莫尼卡2018年的《战神4》将于2022年1月14日推出PC版本,官方在今天公布了一段PC版宣传片,并且公开了游戏的配置需求。下面让我们一起来...
- 男星深情好丈夫形象崩塌,半夜搂美女坐大腿,举止亲密
-
近日,于晓光被拍到深夜在酒吧玩,结束后与一名女子一起上车离开。上车后,女子直接坐在了他腿上,他也顺势搂着美女,美女满脸笑容地坐在他腿上玩手机离开。可能有人会好奇,于晓光是谁呢?于晓光是韩国艺人秋瓷炫的...
- d3d12dll丢失怎么修复?d3d12dll加载失败怎么解决?
-
d3d12.dll丢失怎么修复?d3d12.dll加载失败怎么解决?很多朋友想要运行游戏的时候都会遇到这个问题,这种情况该怎么办呢?今天系统之家小编给朋友们讲讲具体的解决方法,操作其实还蛮简单的。...
- 许多玩家反馈《生化4RE》PC一直崩溃 无法进入游戏
-
今日(3月24日),卡普空《生化危机4:重制版》正式发售,然而有部分PC玩家遇到了游戏崩溃等问题。很多玩家在贴吧发帖称游戏遇到了严重的崩溃问题,且经常反复,报错代码普遍为FatalD3Derror...
- 微软正式推出适用于WSL Linux的D3D12 GPU视频加速技术
-
今天,微软正式向WindowsSubsystemforLinux(WSL)用户发布了Direct3D12GPU视频加速支持。在微软通过WSL允许在Linux下使用Open...
- 《怪物猎人:崛起》曙光系统报错“Fatal d3d error”的解决办法
-
《怪物猎人:崛起》曙光系统报错“Fatald3derror”的解决办法不少小伙伴反应《怪物猎人:崛起》DLC曙光预载以后打不开游戏,出现了Fatald3derror类似的错误代码,这类问题的解...
- Mac+双屏,前端程序员的专业配置 - Loctek 乐歌 D3D 双屏电脑显示器支架
-
做FE也有一段日子了,电脑屏幕每天在设计稿、浏览器、IDE、即时通讯工具、Terminal、邮箱之间切换。虽然mac的工作区带来了很多灵活,但是依然略显不足。于是入手支架,把公司配的电脑和显示器发挥起...
- RPC 的原理和简单使用(rpc详解)
-
RPC的概念RPC,RemoteProcedureCall,翻译成中文就是远程过程调用,是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。在调用的...
- 大厂开源的golang微服务rpc框架 — kitex
-
提前rpc估计所有的开发同学都知道,不知道的也无所谓,毕竟我也好几年没用了,今天带大家在复习一下。RPC(RemoteProcedureCall):远程过程调用,...
- 干货!一文掌握Protobuf所有语言所有用法,快收藏
-
说实话,Protobuf这个库,让人相见时难别亦难,东风无力百花残,每次等到要用它的时候,总感觉还没有完全掌握它的用法,而实际上等去百度或者谷歌的时候,教程都是多么的凌乱不堪。学会它,最直接关系到的,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)