以下是一个基本的串口通信示例,演示如何在 Qt 中打开串口、发送数据、接收数据以及关闭串口。
SerialCommunication.h
#ifndef SERIALCOMMUNICATION_H
#define SERIALCOMMUNICATION_H
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QByteArray>
#include <QObject>
#include <QString>
class SerialCommunication : public QObject
{
Q_OBJECT
public:
explicit SerialCommunication(QObject *parent = nullptr);
~SerialCommunication();
bool openSerialPort(const QString &portName, int baudRate);
void closeSerialPort();
bool writeData(const QByteArray &data);
QByteArray readData();
QStringList getAvailablePorts();
private slots:
void onReadyRead();
private:
QSerialPort *serialPort;
};
#endif // SERIALCOMMUNICATION_H
SerialCommunication.cpp
#include "SerialCommunication.h"
SerialCommunication::SerialCommunication(QObject *parent) : QObject(parent)
{
serialPort = new QSerialPort(this);
connect(serialPort, &QSerialPort::readyRead, this, &SerialCommunication::onReadyRead);
}
SerialCommunication::~SerialCommunication()
{
if (serialPort->isOpen()) {
serialPort->close();
}
}
bool SerialCommunication::openSerialPort(const QString &portName, int baudRate)
{
serialPort->setPortName(portName); // 设置串口名称
serialPort->setBaudRate(baudRate); // 设置波特率
serialPort->setDataBits(QSerialPort::Data8); // 数据位:8位
serialPort->setParity(QSerialPort::NoParity); // 校验位:无
serialPort->setStopBits(QSerialPort::OneStop); // 停止位:1位
serialPort->setFlowControl(QSerialPort::NoFlowControl); // 流控:无
// 尝试打开串口
if (serialPort->open(QIODevice::ReadWrite)) {
qDebug() << "Serial port opened successfully.";
return true;
} else {
qDebug() << "Failed to open serial port:" << serialPort->errorString();
return false;
}
}
void SerialCommunication::closeSerialPort()
{
if (serialPort->isOpen()) {
serialPort->close();
qDebug() << "Serial port closed.";
}
}
bool SerialCommunication::writeData(const QByteArray &data)
{
if (serialPort->isOpen()) {
qint64 bytesWritten = serialPort->write(data);
if (bytesWritten == -1) {
qDebug() << "Failed to write data:" << serialPort->errorString();
return false;
}
return true;
}
return false;
}
QByteArray SerialCommunication::readData()
{
if (serialPort->isOpen()) {
QByteArray data = serialPort->readAll();
return data;
}
return QByteArray();
}
QStringList SerialCommunication::getAvailablePorts()
{
QStringList portList;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
portList.append(info.portName());
}
return portList;
}
void SerialCommunication::onReadyRead()
{
QByteArray data = readData();
qDebug() << "Received data:" << data;
}
主程序 main.cpp
#include <QCoreApplication>
#include "SerialCommunication.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SerialCommunication serialComm;
// 获取所有可用的串口
QStringList availablePorts = serialComm.getAvailablePorts();
if (availablePorts.isEmpty()) {
qDebug() << "No available serial ports.";
return -1;
}
qDebug() << "Available ports:" << availablePorts;
// 假设我们使用第一个可用的串口
QString portName = availablePorts.first();
// 打开串口
if (!serialComm.openSerialPort(portName, 9600)) {
return -1;
}
// 发送数据
serialComm.writeData("Hello, Serial Port!");
// 程序会持续运行,等待接收数据
return a.exec();
}
在使用 Qt 创建串口通信程序时,请确保在项目的
.pro
文件中添加QT += serialport
来链接QtSerialPort
模块。