当前位置: 首页 > news >正文

重学Qt——串口编程

串口编程

在工控行业中,开发者常常需要编写上位机程序来与下位机设备进行通信。

串口是一种常见的通信接口,被广泛应用于工业控制、数据采集等领域。

Qt Serial Port

Qt作为一个强大的跨平台应用程序开发框架,其Serial Port模块为开发者提供了方便快捷的串口通信功能。

  • 使用Qt Serial Port模块,开发者可以轻松地配置串口通信参数,如波特率、数据位、停止位和奇偶校验等。
  • 这些参数的配置对于确保串口通信的稳定性和可靠性至关重要。一旦串口通信参数配置完成,开发者就可以使用Qt Serial Port模块提供的数据读写函数来进行串口数据的收发。

Qt Serial Port模块提供了丰富的API接口,使得开发者可以以阻塞式或非阻塞式的方式来进行数据读写。

在GUI程序中,通常使用非阻塞式方式进行数据读写,以避免阻塞主线程。而在非GUI程序或单独的线程中,开发者则可以使用阻塞式方式进行数据读写。

通过使用Qt Serial Port模块,开发者可以方便地编写出具有串口通信功能的上位机程序。

Qt Serial Port模块

Qt Serial Port模块用于串口通信编程,要在一个项目中使用Qt Serial Port模块,需要在项目配置文件中加入如下一行语句:

QT+=serialport

串口的通信协议比较简单,Qt Serial Port模块中只有两个类:QSerialPortInfo和 QSerialPort。

QSerialPortInfo

QSerialPortInfo 是 Qt 中用于提供串行端口信息的类,它可以帮助开发者获取关于可用串口的信息,比如串口名称、描述、制造商等。下面是对 QSerialPortInfo 的详细介绍及示例。

QSerialPortInfo 类提供以下功能:

  • 列出系统中可用的串行端口。
  • 获取特定串口的详细信息。
  • 检查串口的状态(如是否可用、是否已打开等)。

常用方法

  • availablePorts():静态方法,返回当前所有可用的串口信息列表。
  • portName():返回串口的名称。
  • description():返回用户对串口的描述。
  • manufacturer():返回串口的制造商。
  • isNull():检查对象是否是有效的串口信息。

示例:使用 QSerialPortInfo 列出所有可用串口信息的示例。

#include<QCoreApplication>#include<QSerialPortInfo>#include<QDebug>intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QList<QSerialPortInfo>ports=QSerialPortInfo::availablePorts();if(ports.isEmpty()){qDebug()<<"No available ports.";}else{qDebug()<<"Available Serial Ports:";for(constQSerialPortInfo&portInfo:ports){qDebug()<<"Port Name:"<<portInfo.portName();qDebug()<<"Description:"<<portInfo.description();qDebug()<<"Manufacturer:"<<portInfo.manufacturer();qDebug()<<"Serial Number:"<<portInfo.serialNumber();qDebug()<<"System Location:"<<portInfo.systemLocation();qDebug()<<"Vendor Identifier:"<<portInfo.vendorIdentifier();qDebug()<<"Product Identifier:"<<portInfo.productIdentifier();qDebug()<<"------------------------------------------------";}}returna.exec();}

说明

  1. 项目设置:在 .pro 文件中包含 core 模块:
QT += core
  1. 运行程序:此程序将输出当前系统中的所有可用串口的详细信息,包括端口名称、描述和制造商信息。

QSerialPort

设置串口通信参数
QSerialPort提供了设置串口通信参数的功能,包括波特率、数据位个数、停止位个数和奇偶校验位等。这些参数可以通过QSerialPort的相应函数进行设置和获取。

打开和关闭串口
在设置完串口通信参数后,需要指定串口的名称,然后才能打开串口进行数据读写。打开串口后,当不再需要进行串口通信时,应调用close()函数来关闭串口。

数据读写
QSerialPort提供了多种数据读写方式,包括阻塞式和非阻塞式(异步方式)。在GUI程序中,一般使用非阻塞式方式进行数据读写,以避免阻塞主线程。与异步方式相关的函数可用于读取和写入串口数据。

QSerialPort 类提供以下功能:

  • 打开和配置串行端口。
  • 发送和接收数据。
  • 支持异步和同步操作。
  • 支持多种串口配置,如波特率、数据位、停止位、奇偶校验等。

常用方法

  • open(QIODevice::OpenMode):打开串口。
  • close():关闭串口。
  • setBaudRate():设置波特率。
  • setDataBits():设置数据位数。
  • setParity():设置奇偶校验。
  • setStopBits():设置停止位。
  • write():发送数据。
  • read():接收数据。

示例:示例程序打开串口,并向设备发送数据。

#include<QCoreApplication>#include<QSerialPort>#include<QSerialPortInfo>#include<QDebug>intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QString portName="COM3";// 根据实际情况设置端口名QSerialPort serialPort;serialPort.setPortName(portName);// 设置串口参数if(!serialPort.open(QIODevice::ReadWrite)){qDebug()<<"Failed to open port"<<portName<<":"<<serialPort.errorString();return1;}serialPort.setBaudRate(QSerialPort::Baud9600);serialPort.setDataBits(QSerialPort::Data8);serialPort.setParity(QSerialPort::NoParity);serialPort.setStopBits(QSerialPort::OneStop);serialPort.setFlowControl(QSerialPort::NoFlowControl);// 发送数据QByteArray dataToSend="Hello World";serialPort.write(dataToSend);if(!serialPort.waitForBytesWritten(1000)){qDebug()<<"Failed to write data:"<<serialPort.errorString();}// 读取数据if(serialPort.waitForReadyRead(1000)){QByteArray receivedData=serialPort.readAll();while(serialPort.waitForReadyRead(10)){receivedData+=serialPort.readAll();}qDebug()<<"Received data:"<<receivedData;}else{qDebug()<<"No data received:"<<serialPort.errorString();}serialPort.close();// 关闭串口returna.exec();}

说明

  1. 项目设置:确保在 .pro 文件中包含 serialport 模块:
QT += serialport
  1. 运行程序:根据实际情况设置串口名称(例如:COM1,/dev/ttyUSB0等),然后运行程序。
http://www.zskr.cn/news/1417158.html

相关文章:

  • SolidWorks_草图绘制9_草图性能优化
  • 【零基础部署】Docker 部署 Nginx + SSL 保姆级教程
  • Claude集成测试的“最后一公里”难题:如何用确定性重放+语义断言替代传统JSON Schema校验(IEEE测试标准工作组推荐方案)
  • Python新手如何快速接入Taotoken调用大模型API完成第一个对话
  • 纯硬件模拟电路实现太阳能MPPT充电与光控照明系统设计
  • 【信息科学与工程学】【通信工程】第一百二十一篇 信号处理02 信号处理:小波变换核心算法
  • 别再傻傻分不清了!GTF和GFF3文件格式详解与实战转换指南(附gffread命令)
  • 八大网盘直链下载助手:告别龟速下载的免费解决方案
  • 决策者选专业法兰厂家踩过的坑:头部TOP4实力对比 - 速递信息
  • Go语言并发模式:常见并发范式
  • Windows Cleaner终极指南:3步彻底解决C盘爆红的免费方案
  • FlexNet Publisher许可证服务器端口配置指南
  • 基于ESP32与WS2812打造实体战舰游戏机:从硬件集成到软件开发的完整实践
  • 【算法】小白也能懂 · 第 16 节:拓扑排序
  • 避开次谐波振荡!深入浅出解析电流模式Buck的斜坡补偿与环路稳定
  • DLSS Swapper终极指南:一键切换游戏超采样版本,免费提升显卡性能
  • Navicat Mac版无限试用重置:3种终极解决方案告别14天限制
  • 【Claude私有化部署生死线】:从模型量化精度损失率、KV Cache内存膨胀系数到审计日志完整性验证——金融级落地必查清单
  • LAMMPS模拟石墨烯拉伸:除了velocity,试试这个更省事的deform命令(附完整in文件)
  • 从Excel到MATLAB:手把手教你处理实验数据并完成最小二乘拟合(避坑指南)
  • 告别双系统!在Win11上用WSL2搭建Ubuntu 18.04 + ROS Melodic开发环境(附网络问题终极解决方案)
  • PS 平面图制作立体感教程 4 种实用方法全解析
  • 保姆级教程:在博途V14中手把手配置S7-1500T与V90 PN的PROFINET通信(含HSP安装避坑)
  • 如何快速提升英雄联盟游戏效率:终极自动化工具完整指南
  • 咸阳本地热水器维修 全城就近上门质保一年 - GrowthUME
  • STM32 HAL库三LED九种模式闪烁项目实战:从GPIO原理到工程优化
  • 弯头厂家哪家好主流厂商横评:近两年核心差异(含行业FAQ - 速递信息
  • 基于OpenLIT实现三层 LLM Agent 可观测性的实践
  • 基于Arduino与红外传感器的DIY音乐盒:从传感器原理到嵌入式音乐合成
  • AI Agent 开发大比拼!2026年选型指南,Python仍是王者,TypeScript崛起,混合架构成主流!