news 2026/5/28 22:29:36

重学Qt——串口编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
重学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等),然后运行程序。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 22:27:23

MySQL密码忘了咋办,派大星来救你

MySQL密码遗忘的修改第一步&#xff1a;打开管理员cmdWinR → 输入 cmd → CtrlShiftEnter&#xff08;管理员运行&#xff09;第二步&#xff1a;停止MySQL服务net stop mysql80第三步&#xff1a;跳过密码启动MySQL注意这里找自己的Program Files中的MySQL的bin.cd "C:\…

作者头像 李华
网站建设 2026/5/28 22:25:27

电信ETF(560300.SH)领涨通信板块,近一年涨幅超80%

5月28日&#xff0c;汇添富电信ETF&#xff08;560300.SH&#xff09;收盘报2.480元&#xff0c;涨幅达2.86%&#xff0c;同步跟踪的中证电信指数收报3295.07点&#xff0c;涨幅2.87%&#xff0c;走势高度贴合。数据显示&#xff0c;该ETF当日成交量4114手&#xff0c;换手率1.…

作者头像 李华
网站建设 2026/5/28 22:25:16

3步解决B站缓存视频播放难题:m4s-converter一站式智能转换方案

3步解决B站缓存视频播放难题&#xff1a;m4s-converter一站式智能转换方案 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的烦…

作者头像 李华
网站建设 2026/5/28 22:25:03

从Python列表切片到LLM接口实战:零基础AI编程落地教程

目录Transformer&#xff1a;大模型的底层核心架构阿里ModelScope&#xff1a;国内一站式AI开源社区ModelScope核心含义核心资源与实验场景Notebook文件&#xff1a;AI开发最佳实践载体Markdown与Notebook区别核心优势与适用场景Python List列表&#xff1a;最灵活的通用数据容…

作者头像 李华
网站建设 2026/5/28 22:19:54

React 流式渲染 AI 对话组件:从 SSE 到打字机效果的优雅实现

React 流式渲染 AI 对话组件&#xff1a;从 SSE 到打字机效果的优雅实现 前言 最近在给自己的独立产品加 AI 对话功能。看了一圈开源的 Chat UI 组件&#xff0c;要么依赖太重&#xff0c;要么样式写死没法改。 算了&#xff0c;自己写一个。 需求很简单&#xff1a;接入大模…

作者头像 李华