qt串口阻塞_Qt串口操作
嵌入式设备经常要用到串口与下位机进行通信。本篇主要介绍Qt串口相关操作,环境(Qt5.2+msvc2010编译)
本文主要内容如下:
A.枚举主机的串口名称
foreach(constQSerialPortInfo&info, QSerialPortInfo::availablePorts()){
qDebug()<
if(openSerial(info.portName())){
hasCom=sendShakeHandData(data);
if(hasCom){
comName=info.portName();
serial->close();
break;
}
serial->close();
}
}
Qt提供非常丰富的类让我们很方便的对各个com口进行遍历,并发送握手数据包(根据各自上下位机器之间的协议的实际情况不同),有些是发特定的指令
,如果下位机有response,则表示该com口是我们要找的com名称,立即跳出循环。
B.串口传输数据到下位机
serial=newQSerialPort(portName);
if(serial->open(QIODevice::ReadWrite)) {
QByteArraysendData =
getSendData();
//2.准备发送
qDebug()<
serial->write(sendData);
if(serial->waitForBytesWritten(100))
{
if(serial->waitForReadyRead(1000))
{
//3.校验接收到下位机的数据
if(
!checkResponse(serial,i)
) {
qDebug()<
}else
{
emitupdateProgressBar(fileSize,sendedSize);
}
}
else{
qDebug()<
}
}
qDebug()<
}
qDebug()<
serial->close();
这里的往串口读写数据,采用的是异步阻塞的方式,由于下位机的协议简单,而且上下位机之间的处理数据的能力差异很大。上位机必须控制好波特率,控制好发送和校验的速率。避免将下位机发死机。
waitForReadyRead
和waitForReadyWrite都可以设置一个读写的超时时间。如果频繁的超时,则需要将时间设置的更长一些。接收到下位机器的回复后,要进行数据校验,一般都有校验和,CRC等。校验通过,则继续发送下一包数据,并更新进度条显示。最后数据收发完毕,记得关闭串口。
C.进度条显示传输进度
在实际软件开发中,由于串口的读写数据是异步阻塞的方式,这在UI的程序开发中,肯定不是一件好事情。所以,上面的整个发送的过程必须要交给单独的线程进行。Qt的多线程有很多种方式。这里的使用场景是需要一个线程,做完事情立即退出,所以我采用继承QThread类,并把发送数据的功能代码丢到run()里面去运行。
SerialSendThread*sendThread
= newSerialSendThread(this,getPortName(),byteArray);
connect(sendThread,SIGNAL(updateProgressBar(constquint64,constquint64)),
this,SLOT(setProgressBarValue(constquint64,constquint64)));
connect(sendThread,SIGNAL(finished()),this,SLOT(updateFileFinished()));
connect(sendThread,SIGNAL(finished()),sendThread,SLOT(deleteLater()));
sendThread->start();
在接收到下位机的回复,并校验通过之后,就可以发送updateProgressBar()的信号,通知主界面线程更新状态。
总结:
在发送数据给下位机时,由于下位机的处理能力有限,除了设定超时以外,还可以进行适当的等待sleep。在调试过程中可以配合串口监视工具进行。
qt串口阻塞_Qt串口操作相关推荐
- qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发
前几天分享了一个使用C#开发的串口上位机,那么今天教你如何100行QT代码实现一个串口上位机.如果你学习过C++,那么使用QT开发软件,就不是什么大问题了,QT很多时候使用在linux上.所以使用QT ...
- qt widget 最大_Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)
//Qt主窗口没有最小化,最大化按钮且最大化显示 int main(int argc, char *argv[]) { QApplication a(argc, argv); TestQtForWin ...
- openmv串口数据 串口助手_Qt小项目之串口助手控制LED
前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开发板上的两个LED. 1.软件界 ...
- qt 串口粘包_用Qt 5写一个串口收发桌面工具
今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...
- QT学习串口编程之串口软件的UI设计
学会了如何使用QT进行界面设计之后,接下来让我们来进入第二阶段的学习--串口编程吧. 首先我们需要对串口软件的UI界面进行仿写. 首先存在一个接收方和发送方,接收框主要是串口软件接收设备发来的数据,发 ...
- Linux 使用fcntl c_cc[VMIN] c_cc[CTIME]设置串口阻塞与非阻塞读取数据
一.概述 Linux串口非常灵活,可以根据需要配置成标准串口和自定义串口模式,就Linux 串口读取数据来说,有有两种主要方式:阻塞与非阻塞. 阻塞:一直等待数据,直到退出条件成立: 非阻塞:及时返回 ...
- QT子线程实现串口通信_学习记录
QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...
- serialport接收串口数据_C#串口操作类,包括串口读写操作
串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...
- Qt下实现多线程串口通信
Qt下实现多线程串口通信 Qt下无论是RS232.RS422.RS485的串口通信都可以使用统一的编码实现.本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现. 用Seria ...
最新文章
- iOS8.0 之后指纹解锁
- Daily Scrum02 12.07
- 简单题汇总,小知识点
- 分布式事务科普(初识篇)
- 数据结构—B树(思维导图)
- 51nod 1005 1027 1029 高精度
- Flutter学习 — 实现滑动关闭、删除item
- 3G时代日本手机咸鱼难翻身
- 计算机科学与技术导论课论文题目,优秀计算机专业导论论文题目 计算机专业导论论文题目哪个好...
- Firefox版哔哩哔哩助手,修改自chrome1.2.1版
- QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(下)
- python画国旗和八卦图
- Android7.0适配
- 基于PHP的学生宿舍管理系统
- 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容
- AI智能视频分析平台EasyCVR视频直播弹框关闭后再次打开视频未能从起始时间播放的问题优化
- 深度探索:使用FFmpeg实现视频Logo的添加与移除
- Linux修改网卡设置
- VIC水文模型入门攻略(下) 汇流和其他相关
- L2-4 彩虹瓶 (25分) 栈的运用
热门文章
- 云上资源编排的思与悟
- 【题单——基础字符串】菜鸡L_C_A的基础字符串(KMPACAM)
- 解决Git在clone项目时的fatal
- MyEclipse上CVS的使用说明
- $HADOOP_PREFIX/sbin/start-dfs.sh 启动失败,卡在node2: starting datanode, logging to ……
- 2021牛客暑期训练营1
- android应用发短信
- 没有经验能做产品经理吗?
- 摊牌了,微软始料未及,Excel和WPS用户:我们已经在使用了
- 代码随想录补打卡 647 回文子串 516 最长回文子序列