嵌入式设备经常要用到串口与下位机进行通信。本篇主要介绍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串口操作相关推荐

  1. qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发

    前几天分享了一个使用C#开发的串口上位机,那么今天教你如何100行QT代码实现一个串口上位机.如果你学习过C++,那么使用QT开发软件,就不是什么大问题了,QT很多时候使用在linux上.所以使用QT ...

  2. qt widget 最大_Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)

    //Qt主窗口没有最小化,最大化按钮且最大化显示 int main(int argc, char *argv[]) { QApplication a(argc, argv); TestQtForWin ...

  3. openmv串口数据 串口助手_Qt小项目之串口助手控制LED

    前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开发板上的两个LED. 1.软件界 ...

  4. qt 串口粘包_用Qt 5写一个串口收发桌面工具

    今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...

  5. QT学习串口编程之串口软件的UI设计

    学会了如何使用QT进行界面设计之后,接下来让我们来进入第二阶段的学习--串口编程吧. 首先我们需要对串口软件的UI界面进行仿写. 首先存在一个接收方和发送方,接收框主要是串口软件接收设备发来的数据,发 ...

  6. Linux 使用fcntl c_cc[VMIN] c_cc[CTIME]设置串口阻塞与非阻塞读取数据

    一.概述 Linux串口非常灵活,可以根据需要配置成标准串口和自定义串口模式,就Linux 串口读取数据来说,有有两种主要方式:阻塞与非阻塞. 阻塞:一直等待数据,直到退出条件成立: 非阻塞:及时返回 ...

  7. QT子线程实现串口通信_学习记录

    QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...

  8. serialport接收串口数据_C#串口操作类,包括串口读写操作

    串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...

  9. Qt下实现多线程串口通信

    Qt下实现多线程串口通信 Qt下无论是RS232.RS422.RS485的串口通信都可以使用统一的编码实现.本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现. 用Seria ...

最新文章

  1. iOS8.0 之后指纹解锁
  2. Daily Scrum02 12.07
  3. 简单题汇总,小知识点
  4. 分布式事务科普(初识篇)
  5. 数据结构—B树(思维导图)
  6. 51nod 1005 1027 1029 高精度
  7. Flutter学习 — 实现滑动关闭、删除item
  8. 3G时代日本手机咸鱼难翻身
  9. 计算机科学与技术导论课论文题目,优秀计算机专业导论论文题目 计算机专业导论论文题目哪个好...
  10. Firefox版哔哩哔哩助手,修改自chrome1.2.1版
  11. QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(下)
  12. python画国旗和八卦图
  13. Android7.0适配
  14. 基于PHP的学生宿舍管理系统
  15. 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容
  16. AI智能视频分析平台EasyCVR视频直播弹框关闭后再次打开视频未能从起始时间播放的问题优化
  17. 深度探索:使用FFmpeg实现视频Logo的添加与移除
  18. Linux修改网卡设置
  19. VIC水文模型入门攻略(下) 汇流和其他相关
  20. L2-4 彩虹瓶 (25分) 栈的运用

热门文章

  1. 云上资源编排的思与悟
  2. 【题单——基础字符串】菜鸡L_C_A的基础字符串(KMPACAM)
  3. 解决Git在clone项目时的fatal
  4. MyEclipse上CVS的使用说明
  5. $HADOOP_PREFIX/sbin/start-dfs.sh 启动失败,卡在node2: starting datanode, logging to ……
  6. 2021牛客暑期训练营1
  7. android应用发短信
  8. 没有经验能做产品经理吗?
  9. 摊牌了,微软始料未及,Excel和WPS用户:我们已经在使用了
  10. 代码随想录补打卡 647 回文子串 516 最长回文子序列