Qt中串口通信

Qt中提供QSerialPort类实现串口通信。

示例代码:

//serialportdemo.h
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class SerialPortDemo; }
QT_END_NAMESPACE

class SerialPortDemo : public QMainWindow
{
    Q_OBJECT

public:
    SerialPortDemo(QWidget *parent = nullptr);
    ~SerialPortDemo();

private slots:
    void readData();

    void on_openSerialBtn_clicked();

    void on_sendBtn_clicked();

private:
    Ui::SerialPortDemo *ui;
    QSerialPort *serial;
    bool SerialIsOpen = false;
};

//serialportdemo.cpp
#include "serialportdemo.h"
#include "ui_serialportdemo.h"

SerialPortDemo::SerialPortDemo(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::SerialPortDemo)
{
    ui->setupUi(this);
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite)){
            ui->portBox->addItem(serial.portName());
            serial.close();
        }
    }
    ui->baudBox->setCurrentIndex(0);
}

SerialPortDemo::~SerialPortDemo()
{
    delete ui;
}

void SerialPortDemo::on_openSerialBtn_clicked()
{
    if(!SerialIsOpen){
        serial = new QSerialPort;
        serial->setPortName(ui->portBox->currentText());
        serial->open(QIODevice::ReadWrite);
        serial->setBaudRate(QSerialPort::Baud115200);
        switch (ui->dataBox->currentIndex()) {
        case 0:
            serial->setDataBits(QSerialPort::Data8);
            break;
        default:
            break;
        }
        switch (ui->checkBox->currentIndex()) {
        case 0:
            serial->setParity(QSerialPort::NoParity);
            break;
        default:
            break;
        }
        switch (ui->stopBox->currentIndex()) {
        case 0:
            serial->setStopBits(QSerialPort::OneStop);
            break;
        case 1:
            serial->setStopBits(QSerialPort::TwoStop);
            break;
        default:
            break;
        }
        serial->setFlowControl(QSerialPort::NoFlowControl);

        SerialIsOpen = true;
        ui->portBox->setEnabled(false);
        ui->dataBox->setEnabled(false);
        ui->checkBox->setEnabled(false);
        ui->stopBox->setEnabled(false);
        ui->baudBox->setEnabled(false);
        ui->openSerialBtn->setText("Close");
        QObject::connect(serial, &QSerialPort::readyRead, this, &SerialPortDemo::readData);
    }else{
        serial->clear();
        serial->close();
        serial->deleteLater();

        SerialIsOpen = false;
        ui->portBox->setEnabled(true);
        ui->dataBox->setEnabled(true);
        ui->checkBox->setEnabled(true);
        ui->stopBox->setEnabled(true);
        ui->baudBox->setEnabled(true);
        ui->openSerialBtn->setText("Open");
    }

}

void SerialPortDemo::on_sendBtn_clicked()
{
    serial->write(ui->txtWrite->toPlainText().toLatin1());
}

void SerialPortDemo::readData(){
    QByteArray buf;
    buf = serial->readAll();
    if(!buf.isEmpty()){
        QString str = buf;
        ui->txtRead->append(str);
    }
    buf.clear();
}

UI界面:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值