重学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等),然后运行程序。
相关推荐
sycmancia2 小时前
Qt——Qt中的调色板
开发语言·qt
我在人间贩卖青春2 小时前
重学Qt——多媒体
qt
yugi9878382 小时前
基于Qt的图像处理系统
开发语言·图像处理·qt
努力努力再努力wz16 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
奇树谦17 小时前
QML 开发前端界面详解:从入门到示例实战
qt
我在人间贩卖青春17 小时前
重学Qt——网络编程
qt
caicai_xiaobai1 天前
Notepad++手动安装 Hex-Editor 插件
qt
郝学胜-神的一滴1 天前
Qt 高级开发 015:C++ 原生实现信号槽机制
开发语言·c++·qt·软件构建·用户界面
我在人间贩卖青春1 天前
重学Qt——数据可视化
qt