Qt 串口类QSerialPort 使用笔记
Qt 串口类QSerialPort 使用笔记
虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。
当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。
QSerialPort 类提供了操作串口的各种接口。
QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。
使用方法
先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。
首先,需要在pro文件中增加如下内容:
QT += serialport
Cpp 文件如下:
- #include <QCoreApplication>
- #include <QDebug>
- #include <QSerialPort>
- #include <QSerialPortInfo>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
- {
- qDebug() << "Name : " << info.portName();
- qDebug() << "Description : " << info.description();
- qDebug() << "Manufacturer: " << info.manufacturer();
- qDebug() << "Serial Number: " << info.serialNumber();
- qDebug() << "System Location: " << info.systemLocation();
- }
- return a.exec();
- }
在我的电脑上显示的结果如下:
- Name : "COM1"
- Description : "通信端口"
- Manufacturer: "(标准端口类型)"
- Serial Number: ""
- System Location: "\\.\COM1"
- Name : "COM5"
- Description : "USB Serial Port"
- Manufacturer: "FTDI"
- Serial Number: "A400G3UXA"
- System Location: "\\.\COM5"
通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。
- #include <QCoreApplication>
- #include <QDebug>
- #include <QSerialPort>
- #include <QSerialPortInfo>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QSerialPortInfo com_info;
- foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
- {
- if( info.serialNumber() == "A400G3UXA" )
- {
- com_info = info;
- break;
- }
- }
- qDebug() << "Name : " << com_info.portName();
- qDebug() << "Description : " << com_info.description();
- qDebug() << "serialNumber: " << com_info.serialNumber();
- return a.exec();
- }
QSerialPort 负责具体的串口操作。选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。
另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()
每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。
下面的代码片段给出了设置串口的例子。
- m_reader.setPort(info);
- if(m_reader.open(QIODevice::ReadWrite))
- {
- qDebug() << "m_reader.open(QIODevice::ReadWrite)";
- m_reader.setBaudRate(QSerialPort::Baud9600);
- m_reader.setParity(QSerialPort::NoParity);
- m_reader.setDataBits(QSerialPort::Data8);
- m_reader.setStopBits(QSerialPort::OneStop);
- m_reader.setFlowControl(QSerialPort::NoFlowControl);
- m_reader.clearError();
- m_reader.clear();
- connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
- }
- void Dialog::readyReadSlot()
- {
- qDebug() << "x";
- QByteArray arr = m_reader.readAll();
- do_something(arr);
- }
Qt 串口类QSerialPort 使用笔记的更多相关文章
- <QT之Bug制造机>QT中串口类“QSerialPort”的学习笔记
QT5中已经增加了串口类QSrialPort,可以直接调用API函数进行快速开发. 1. 获取串口信息 Dialog::Dialog(QWidget *parent) : QDialog(parent ...
- QT串口助手(二):参数配置
作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 主要实现功能 串口参数的配置:波特率.数据位.停止位.校验位 本机串口设备的查询与添加显示 串口设备的手动更新与打 ...
- 【转】QT 串口QSerialPort + 解决接收数据不完整问题
类:QSerialPort 例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在这上面修改就可以得到自己的串口软件.核心方法 // ...
- 【学习笔记】QT常用类及应用
一.QT基类: QObject 二.QT中常用的库 QT中的类根据功能划分在不同的库中,在用户属性.pro文件中可以看到. 三.Qt基本对话框的使用 常用5类: 通过类名可以直接调用类的静态成员函数. ...
- Qt串口通信
1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...
- QT5入门之23 -QT串口编程(转)
QT5入门之23 -QT串口编程 QT5有专门的串口类: QSerialPort:提供访问串口的功能 QSerialPortInfo:提供系统中存在的串口的信息 具体使用方法: 1.在pro文件中 ...
- Qt 串口连接
Qt 串口连接 使用 Qt 开发上位机程序时,经常需要用到串口,在 Qt 中访问串口比较简单,因为 Qt 已经提供了 QSerialPort 和 QSerialPortInfo 这两个类用于访问串口. ...
- QT串口助手(三):数据接收
作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的接收 ascii字符形式显示与hex字符形式显 ...
- QT串口助手(四):数据发送
作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...
随机推荐
- 解析Excel
package com.jpcar.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExcep ...
- java总结(一)(变量类型)
java代码运行原理 需要注意 公共类类名必须和文件名相同 一个文件可以有好几个类,编译生成n个类文件名 chcp 65001----utf8 936----GBK 437----美国英语 文档注释必 ...
- thinkphp5.0配置作用域
作用域 配置参数支持作用域的概念,默认情况下,所有参数都在同一个系统默认作用域下面.如果你的配置参数需要用于不同的项目或者相互隔离,那么就可以使用作用域功能,作用域的作用好比是配置参数的命名空间一样. ...
- jQuery.Validate.js验证大表单的优化
最近在项目中有遇到一个Form表单中有200多个标签.在提交表单时网页会出现等待时间很长,甚至会出现网页奔溃的情况. 主要的原因是因为在使用jQuery.Validate.js进行Form验证的时候会 ...
- WSDL语法
<什么是WSDL语言> WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及 ...
- 2017四川省赛D题《Dynamic Graph》
题意:给出一个n个点m条边的有向无环图(DAG),初始的时候所有的点都为白色.然后有Q次操作,每次操作要把一个点的颜色改变,白色<->黑色,对于每次操作,输出满足下列点对<u,v&g ...
- AGC026D Histogram Coloring
link 题意: 给定n列的方块,第i列高度$h_i$.现在要把它染成红蓝两色,要求满足:对于任意一个$2\times 2$的区域,恰有2个蓝色,2个红色.问方案数. $n\leq 100,h_i\l ...
- [POJ1205]Water Treatment Plants
题目大意: 有一排n个格子,要在它们上面装管道. 每个格子上的管道都是T形的,但是可以有三种流动的方向. 每种都是把两个方向的水往另一个方向排出. 如果方向是向左或向右,就是排到相邻的格子里. 特别地 ...
- Mysql -- 设置中国时区时间
Mysql -- 设置中国时区时间 查看mysql的时区设置 mysql> show variables like '%time_zone%'; 修改mysql的时区设置, 注:mysql ...
- Codeforces Round #299 (Div. 1) A. Tavas and Karafs 水题
Tavas and Karafs Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/536/prob ...