重学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模块,需要在项目配置文件中加入如下一行语句:

plain 复制代码
QT+=serialport

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

QSerialPortInfo

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

QSerialPortInfo 类提供以下功能:

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

常用方法

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

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

cpp 复制代码
#include <QCoreApplication>
#include <QSerialPortInfo>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    if (ports.isEmpty()) {
        qDebug() << "No available ports.";
    } else {
        qDebug() << "Available Serial Ports:";
        for (const QSerialPortInfo &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() << "------------------------------------------------";
        }
    }

    return a.exec();
}

说明

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

QSerialPort

设置串口通信参数

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

打开和关闭串口

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

数据读写

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

QSerialPort 类提供以下功能:

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

常用方法

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

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

cpp 复制代码
#include <QCoreApplication>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QString portName = "COM3";  // 根据实际情况设置端口名

    QSerialPort serialPort;
    serialPort.setPortName(portName);

    // 设置串口参数
    if (!serialPort.open(QIODevice::ReadWrite)) {
        qDebug() << "Failed to open port" << portName << ":" << serialPort.errorString();
        return 1;
    }

    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();  // 关闭串口
    return a.exec();
}

说明

  1. 项目设置:确保在 .pro 文件中包含 serialport 模块:
plain 复制代码
QT += serialport
  1. 运行程序:根据实际情况设置串口名称(例如:COM1,/dev/ttyUSB0等),然后运行程序。
相关推荐
hssfscv12 小时前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
luoyayun36114 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
小短腿的代码世界1 天前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界1 天前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远1 天前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳7852 天前
【Qt】系统相关(3)——多线程
qt
初阳7852 天前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia2 天前
Qt——多线程间的互斥
开发语言·qt
尘中远3 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图