首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Qt 串口通訊:按鈕點擊發送不同數據實現指南

     編輯:程式設計疑難解答

核心步驟

  1. 添加串口模塊:`.pro` 增加 `QT += serialport`。
  2. 打開串口:構造函數/初始化函數中配置 `QSerialPort` 參數 (波特率、數據位、校驗位、停止位、流控)。
  3. 按鈕信號連接槽函數:每個按鈕 `clicked()` 連接到統一發送槽,區分發送內容。

完整示例


// MainWindow.h
#include 
#include 
#include 

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
private slots:
    void onBtnClicked(int cmdId); // 統一槽
private:
    QSerialPort *serial;
    void sendCommand(const QByteArray &data);
};

// MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    serial = new QSerialPort(this);
    serial->setPortName("COM3"); // 或 /dev/ttyUSB0
    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    if (!serial->open(QIODevice::ReadWrite)) {
        qDebug() << "串口打開失敗:" << serial->errorString();
    }
    
    // 假設 UI 有 btn1, btn2, btn3
    connect(ui->btn1, &QPushButton::clicked, [this]{ onBtnClicked(1); });
    connect(ui->btn2, &QPushButton::clicked, [this]{ onBtnClicked(2); });
    connect(ui->btn3, &QPushButton::clicked, [this]{ onBtnClicked(3); });
}

void MainWindow::onBtnClicked(int cmdId) {
    QByteArray data;
    switch (cmdId) {
        case 1: data = QByteArray::fromHex("01 02 03"); break; // 按鈕1發送 01 02 03
        case 2: data = "CMD2\n"; break;                        // 按鈕2發送字符串
        case 3: data = QByteArray(1, 0x55); break;             // 按鈕3發送單字節 0x55
    }
    sendCommand(data);
}

void MainWindow::sendCommand(const QByteArray &data) {
    if (serial && serial->isOpen()) {
        qint64 written = serial->write(data);
        if (written == -1) qDebug() << "發送失敗:" << serial->errorString();
        else serial->flush(); // 確保發送緩衝區寫入
    }
}

參考資源

進階提示

  • 接收數據:連接 `serial->readyRead()` 信號到讀取槽,`readAll()` 獲取數據並解析。
  • 線程安全:耗時解析/處理移至工作線程 (`QThread`/`QtConcurrent`),避免阻塞 UI。
  • 協議設計:定義幀頭/幀尾/校驗和 (CRC/Checksum),應對粘包/分包。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved