qt串口通信

以下是一个基本的串口通信示例,演示如何在 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 模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值