串口编程
在工控行业中,开发者常常需要编写上位机程序来与下位机设备进行通信。
串口是一种常见的通信接口,被广泛应用于工业控制、数据采集等领域。
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();}说明
- 项目设置:在 .pro 文件中包含 core 模块:
QT += core- 运行程序:此程序将输出当前系统中的所有可用串口的详细信息,包括端口名称、描述和制造商信息。
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();}说明
- 项目设置:确保在 .pro 文件中包含 serialport 模块:
QT += serialport- 运行程序:根据实际情况设置串口名称(例如:COM1,/dev/ttyUSB0等),然后运行程序。