首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 串口通信控制光源:完整 C++ 類封裝與 Qt 測試實例

     編輯:關於C語言

架構設計

分層封裝:底層 bmLightComm 處理 Win32 Serial API,中層 bmLightControl 管理單控制器 4 通道亮度,上層 bmLightManage 統籌 3 個控制器(COM1~COM3),最上層 Qt GUI 提供滑桿同步調節 12 通道。

核心類:bmLightComm — 同步串口收發

class bmLightComm {
    HANDLE mCom;
public:
    bool openPort(const char* port);                    // CreateFile
    bool setupPort(DWORD baud, BYTE byteSize, BYTE stopBits, DWORD parity, BYTE parityMode); // DCB 設定
    bool setBufferAreaSize(DWORD inQ, DWORD outQ);      // SetupComm
    bool setComTimeout(DWORD readInt, DWORD readMul, DWORD readConst, DWORD writeMul, DWORD writeConst); // COMMTIMEOUTS
    bool purgePort(DWORD flags);                        // PurgeComm (TX/RX 清空)
    bool closePort();                                   // CloseHandle
    bool sendBuff(const char* data, unsigned int len);  // WriteFile
    char readBuff();                                    // ReadFile (單字元)
};

關鍵串口設定細節

  • DCB:BaudRate=19200, ByteSize=8, StopBits=ONESTOPBIT, Parity=NOPARITY, fParity=FALSE。
  • 緩衝區:SetupComm(mCom, 1024, 1024)。
  • 超時:範例未啟用(註解掉),實務建議設定 ReadTotalTimeoutConstant 避免永久阻塞。
  • 收發前均呼叫 PurgeComm 清空對應緩衝區,確保同步收發無殘留資料。

協定封裝:bmLightControl

每控制器 4 通道,協定格式:S + CH0 + CH1 + CH2 + CH3 + C#

  • 單通道 4 字元:3 位亮度 (000~255) + 1 位開關 (T/F)。
  • 範例:通道 0 亮度 128 開啟 → 128T。
  • sendBright() 組裝 18 字元指令字串發送,並讀取 1 字元回應。

Qt 測試介面

class qttestcomm : public QWidget {
    QSlider mslider;      // 0~255
    bmLightManage m;      // 3 控制器
public slots:
    void slot1(int va) {  // 滑桿值變化
        std::vector ll;
        for (int dev=0; dev<3; dev++)
            for (int ch=0; ch<4; ch++)
                ll.emplace_back(dev, ch, true, va);  // 全開、同亮度
        m.setBright(ll);
    }
};

避坑指南與改進建議

問題風險改進
sendBuff 用 sizeof(const char)*lensizeof(const char) 永遠是 1,語義誤導直接用 len 或 strlen(data)
readBuff 僅讀 1 字元回應可能超過 1 字元,導致殘留改為讀取指定長度或直到終止符
無錯誤碼轉換為例外/錯誤碼上層難以區分錯誤類型回傳 enum 或 std::error_code
Qt 介面直接在 UI 線程阻塞串口通訊延遲會凍結介面移至 QThread 或使用 QSerialPort 非同步模式
硬編碼 COM1~COM3部署機器埠號不同需改碼掃描可用埠或讀取設定檔

現代化替代方案

  • Qt 專案:直接使用 QSerialPort(跨平台、非同步、信號槽整合),無需手寫 Win32 封裝。
  • 標準 C++:boost::asio::serial_port 或 C++20 std::execution 配合平台抽象層。
  • 嵌入式 Linux:termios API + epoll 非阻塞 I/O。

總結

此專案展示了從 Win32 底層 API 到業務邏輯封裝、再到 GUI 整合的完整串口應用開發流程。雖然代碼風格偏向「首次嘗試」階段(硬編碼、同步阻塞、錯誤處理簡易),但架構分層清晰,協定封裝得當,是嵌入式上位機開發的優秀入門範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved