核心步驟
- 添加串口模塊:`.pro` 增加 `QT += serialport`。
- 打開串口:構造函數/初始化函數中配置 `QSerialPort` 參數 (波特率、數據位、校驗位、停止位、流控)。
- 按鈕信號連接槽函數:每個按鈕 `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),應對粘包/分包。