qt串口助手开发教程,Qt开发小工具之三串口设备调试工具
qt串口助手开发教程,Qt开发小工具之三串口设备调试工具第三步:初始化主界面,自动加载对应串口号波特率等信息。第二步:准备unix和windows串口通信第三方类qextserialport.h、qextserialport.cpp、qextserialport_global.h、qextserialport_p.h、qextserialport_unix.cpp、qextserialport_win.cpp。技术实现:通过第三方串口通信类,解析协议并作出处理1:支持16进制数据发送与接收。第一步:布局好界面,控件命名好,建议用pascal命名法。
一、前言这个为什么叫串口设备调试工具而不是串口调试工具,是因为这个工具比网络上的串口调试工具多出了一些真实需要的用来调试设备的功能,首先一点就是大部分的串口调试工具收到数据都是立即返回,这样的数据都是连着的,头一条数据和后一条数据头尾相连,对于调试着来说要看数据非常麻烦,而且在不断有数据过来时,要停下来看数据除非关闭串口,而不能在打开串口的时候看数据,因为不断有数据过来冲掉前面的数据显示,甚至有些还不能最大化等等情况,这个工具是根据将近四年的与硬件通信这块开发工具的切身实际需求量身定做的,还能模拟设备立即回复数据。之前很多Qt开发的版本源码分成两套,一套在windows下编译,一套在linux下编译,甚至麻烦,虽然QT5.1之后的版本自带了串口通信类,本人测试过,貌似还有小问题,在快速收发数据时容易卡住,这次带来的源码不用做任何改动即可在多个平台编译。
二、项目环境项目名称:串口设备调试工具
开发环境:WIN7 QT4.7 QT CREATOR2.8 MINGW
已编译通过测试平台:XP、Win7、ubuntu、tiny210
技术实现:通过第三方串口通信类,解析协议并作出处理
三、基本功能1:支持16进制数据发送与接收。
第一步:布局好界面,控件命名好,建议用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(); }