Qt 串口类QSerialPort 使用笔记

Qt 串口类QSerialPort 使用笔记

 

虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。

 

当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort QSerialPortInfo

QSerialPort 类提供了操作串口的各种接口。

QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。

使用方法

先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。

首先,需要在pro文件中增加如下内容:

QT += serialport

 

Cpp 文件如下:

[cpp] view plaincopy
  1. #include <QCoreApplication>  
  2. #include <QDebug>  
  3.    
  4. #include <QSerialPort>  
  5. #include <QSerialPortInfo>  
  6.    
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QCoreApplication a(argc, argv);  
  10.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
  11.     {  
  12.         qDebug() << "Name : " << info.portName();  
  13.         qDebug() << "Description : " << info.description();  
  14.         qDebug() << "Manufacturer: " << info.manufacturer();  
  15.         qDebug() << "Serial Number: " << info.serialNumber();  
  16.         qDebug() << "System Location: " << info.systemLocation();  
  17.     }  
  18.     return a.exec();  
  19. }  

在我的电脑上显示的结果如下:

[plain] view plaincopy
  1. Name :  "COM1"  
  2. Description :  "通信端口"  
  3. Manufacturer:  "(标准端口类型)"  
  4. Serial Number:  ""  
  5. System Location:  "\\.\COM1"  
  6. Name :  "COM5"  
  7. Description :  "USB Serial Port"  
  8. Manufacturer:  "FTDI"  
  9. Serial Number:  "A400G3UXA"  
  10. System Location:  "\\.\COM5"  

通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。

[cpp] view plaincopy
  1. #include <QCoreApplication>  
  2. #include <QDebug>  
  3. #include <QSerialPort>  
  4. #include <QSerialPortInfo>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QCoreApplication a(argc, argv);  
  9.     QSerialPortInfo com_info;  
  10.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
  11.     {  
  12.         if( info.serialNumber() == "A400G3UXA" )  
  13.         {  
  14.             com_info = info;  
  15.             break;  
  16.         }  
  17.     }  
  18.     qDebug() << "Name : " << com_info.portName();  
  19.     qDebug() << "Description : " << com_info.description();  
  20.     qDebug() << "serialNumber: " << com_info.serialNumber();  
  21.     return a.exec();  
  22. }  

QSerialPort 负责具体的串口操作。选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。

另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()

每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。

下面的代码片段给出了设置串口的例子。

[cpp] view plaincopy
  1.     m_reader.setPort(info);  
  2.     if(m_reader.open(QIODevice::ReadWrite))  
  3.     {  
  4.         qDebug() << "m_reader.open(QIODevice::ReadWrite)";  
  5.         m_reader.setBaudRate(QSerialPort::Baud9600);  
  6.         m_reader.setParity(QSerialPort::NoParity);  
  7.         m_reader.setDataBits(QSerialPort::Data8);  
  8.         m_reader.setStopBits(QSerialPort::OneStop);  
  9.         m_reader.setFlowControl(QSerialPort::NoFlowControl);  
  10.   
  11.         m_reader.clearError();  
  12.         m_reader.clear();  
  13.         connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));  
  14. }  
  15.   
  16.   
  17. void Dialog::readyReadSlot()  
  18. {  
  19.     qDebug() << "x";  
  20.     QByteArray arr = m_reader.readAll();  
  21.     do_something(arr);  
  22. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性

大家都知道&#xff0c;seo的一个很重要的一点就是要把网站做的条理清晰&#xff0c;让搜索引擎很容易的读明白&#xff0c;这个条理清晰不仅体现在网站的物理路径&#xff0c;url等地 方。在<h1><h2><h3>等方面也是这样。并不是<h1>对于关键字排名有帮…

OC语言中的便利初始化函数和便利构造器

便利遍历初始化函数与便利构造器&#xff08;以Student类为例&#xff09;&#xff1b; main函数 Student.h&#xff08;声明&#xff09; 。。。。。。。。。。。。。。。。。。。 Student.m&#xff08;实现&#xff09; 。。。。。。。。。。。。。。。。。 转载于:https://…

MySQL 性能监控 4 大指标

【编者按】本文作者为 John Matson&#xff0c;主要介绍 mysql 性能监控应该关注的 4 大指标。 文章系国内 ITOM 管理平台 OneAPM 编译呈现。 MySQL 是什么&#xff1f; MySQL 是现而今最流行的开源关系型数据库服务器。由 Oracle 所有&#xff0c;MySQL 提供了可以免费下载的社…

【深度相机系列四】深度相机原理揭秘--结构光(iPhone X 齐刘海原理)

from&#xff1a;https://blog.csdn.net/electech6/article/details/78707839导读 结构光法&#xff1a;为解决双目匹配问题而生 深度图效果&#xff1a;结构光vs.双目 投射图案的编码方式直接编码时分复用编码空分复用编码 Kinect1原理 iPhone X原深感相机是缩小版的更强大的K…

iOS开发中对于一些常用的相对路径(持续更新)

1.iOS开发的证书的描述文件放置地点 ~/Library/MobileDevice/Provisioning Profiles 2.$(SRCROOT)代表的是这个项目文件夹所在的位置 $(PROJECT_DIR) 表示的包含可执行文件的哪一个文件夹 3.对于pod导入的第三方库&#xff0c;引用不自动补全问题。选择target -> BuildSet…

Android倒计时工具类

为什么80%的码农都做不了架构师&#xff1f;>>> 原文地址:http://my.oschina.net/reone/blog/710003 多谢touch_ping 的回应. 原来api有这个类 android.os.CountDownTimer , 具体实现很下面的差不多. import android.content.Context; import android.os.Handler…

深度相机原理揭秘--双目立体视觉

欢迎关注计算机视觉life&#xff01;导读 为什么非得用双目相机才能得到深度&#xff1f; 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理理想双目相机成像模型极线约束图像矫正技术基于滑动窗口的图像匹配基于能量优化的图像匹配 双目立体视觉深度相机的优…

微信扫码支付模式一和模式二的区别

http://www.baidu.com/link?urlAj_xhOM5Q6rpZXkTMBPq4o0UbCO4eLq0esX8B3K2v06bkRS8F8lC4k06rv-3uZARLLTEKJHMhwzI_cdcJiHfqK&wd&eqid904bc71f000181740000000356d7d9bf https://www.zhihu.com/question/35818812/answer/66086727 知乎页面访问存在502 Bad Gateway问题…

双目视觉几何框架详解(玉米专栏8篇汇总)

一、图像坐标&#xff1a;我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的数学主线。数…

(原)Ubuntu14中安装GraphicsMagick

转载请注明出处&#xff1a; http://www.cnblogs.com/darkknightzh/p/5661439.html 参考网址&#xff1a; http://comments.gmane.org/gmane.comp.video.graphicsmagick.core/514 http://www.graphicsmagick.org/INSTALL-unix.html https://github.com/clementfarabet/graphics…

js全局函数

1.parseInt(String,radix):返回转换成整数的值。 注意&#xff1a;当参数radix的值为0&#xff0c;或者没有设置这个参数&#xff0c;parseInt()会根据string来判断数字的基数。 当忽略radix&#xff0c;JavaScript默认数字的基数规则为&#xff1a; 1.如果string以0x开头&…

android之自定义广播

布局文件 点击按钮发送广播 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical" android:layout_width"match_parent&qu…

世界坐标系和相机坐标系,图像坐标系的关系

from&#xff1a;https://blog.csdn.net/waeceo/article/details/50580607一、四个坐标系简介和转换相机模型为以后一切标定算法的关键&#xff0c;只有这边有相当透彻的理解&#xff0c;对以后的标定算法才能有更好的理解。本人研究了好长时间&#xff0c;几乎每天都重复看几遍…

PythonOCC 3D图形库学习—创建立方体模型

Open CASCADE&#xff08;简称OCC&#xff09;平台是是一个开源的C类库&#xff0c;OCC主要用于开发二维和三维几何建模应用程序&#xff0c;包括通用的或专业的计算机辅助设计CAD系统、制造或分析领域的应用程序、仿真应用程序或图形演示工具。 PythonOCC是对Open CASCADE的封…

Struts2、SpringMVC、Servlet(Jsp)性能对比 测试 。 Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照...

2019独角兽企业重金招聘Python工程师标准>>> Struts2、SpringMVC、Servlet(Jsp)性能对比 测试 。 Servlet的性能应该是最好的&#xff0c;可以做为参考基准&#xff0c;其它测试都要向它看齐&#xff0c;参照它。 做为一个程序员&#xff0c;对于各个框架的性能要有…

深度相机(三)--三种方案对比

from&#xff1a;https://blog.csdn.net/app_12062011/article/details/52511701RGBD方案对比&#xff1a;关键技术规格&#xff1a; 1.检测范围&#xff1b; 2.检测精度&#xff1b; 3.检测角度&#xff1b; 4.帧率。 5.模块大小 6.功耗 目前主流的深度摄像头方案在检测距离上…

Activity隐式启动IntentFilter

时间&#xff1a;2016年3月4日09:54:02IntentFilter过滤信息&#xff1a;action、category、dataaction&#xff1a;1.Intent中的action必须能够和过滤条件中的action匹配&#xff0c;过滤条件中可以有多个action。2.Intent中如果设置多个action则过滤条件中必须至少有同样数量…

基于图像分割的立体匹配方法

1.绪论 立体匹配是三维重建系统的关键步骤&#xff0c;并且作为一种非接触测量方法在工业以及科研领域具有重要的应用价值。为了完成匹配工作以及获取场景的稠密视差图&#xff0c;可以通过构建能量函数对应立体匹配的约束条件。复杂能量函数的全局最优解通常是NP难问题。相对于…

深度相机之TOF原理详解

/*******************************************************************************************************************本文转载源链接没有找到&#xff0c;若有幸被原创作者访问到&#xff0c;请留下原出处&#xff0c;我会更新&#xff0c;谢谢&#xff0c;转载至我的博…

nodejs npm常用命令

npm是一个node包管理和分发工具&#xff0c;已经成为了非官方的发布node模块&#xff08;包&#xff09;的标准。有了npm&#xff0c;可以很快的找到特定服务要使用的包&#xff0c;进行下载、安装以及管理已经安装的包。 1、npm install moduleNames&#xff1a;安装Node模块安…