当前位置: 首页 > 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.jsqmd.com/news/905856/

相关文章:

  • SolidWorks_草图绘制9_草图性能优化
  • 脱离 CRUD 舒适区:硬核全栈实战项目
  • Rust配置管理:构建灵活的配置系统
  • 【零基础部署】Docker 部署 Nginx + SSL 保姆级教程
  • 别再只会apt-get了!Ubuntu 22.04上从源码编译安装Open vSwitch 3.2的完整指南
  • Socket BIO NIO AIO 基本概念
  • Open-Meteo:如何零成本获取专业级天气数据API的完整指南
  • 太和养老系统:打造智慧养老生态圈 #05272141
  • AI风口上,我靠“养猪”月入过万?算力副业真能躺赚吗?
  • 经典算法题之我能赢吗(二)
  • 【零基础部署】Docker 部署 Redis 保姆级教程
  • Claude集成测试的“最后一公里”难题:如何用确定性重放+语义断言替代传统JSON Schema校验(IEEE测试标准工作组推荐方案)
  • 小白也能看懂!AI大模型概念清单,收藏这份学习指南轻松入门
  • Python新手如何快速接入Taotoken调用大模型API完成第一个对话
  • 卖牛卡纸(原纸)怎么找客户?下游工厂都在哪里
  • 从Python列表切片到LLM接口实战:零基础AI编程落地教程
  • 2026信创网安服务器哪家靠谱?基于五维能力的可靠性评估标准与结论 - 速递信息
  • MySQL密码忘了咋办,派大星来救你
  • 论文ai痕迹怎么去?2026年4款降AI率软件深度推荐+实测
  • 告别杜邦线乱飞!用PCF8574模块和I2C总线,让你的51单片机LCD1602接线清爽起来
  • 从实验室到上车:一份完整的车载毫米波雷达环境与耐久性测试清单
  • taotoken平台api调用稳定性与低延迟实际网络测试感受
  • Layuimini企业级无限级菜单系统:轻量级架构与高性能导航解决方案
  • 2026实测乌鲁木齐四大财税机构:公司注册首选TOP1出炉! - 小柏云
  • Go语言错误处理:Error vs Panic
  • 16 - 常用内置函数与标准库
  • 纯硬件模拟电路实现太阳能MPPT充电与光控照明系统设计
  • GitNexus是Monorepo单体仓库
  • 电磁直线执行器直接驱动的流体控制阀系统【附程序】
  • 【信息科学与工程学】【通信工程】第一百二十一篇 信号处理02 信号处理:小波变换核心算法