有幾種解決方案,根據你的具體需求選擇:

方案1:傳遞CISerialPort對象引用(推薦)

在需要使用CheckConnection()的類中持有CISerialPort的引用:

cpp

// 在需要使用CheckConnection的類中
class MyOtherClass {
private:
    CISerialPort& serial_port_;  // 引用
    
public:
    // 通過構造函數傳入
    MyOtherClass(CISerialPort& serial_port) : serial_port_(serial_port) {}
    
    void SomeMethod() {
        if (serial_port_.CheckConnection()) {
            // 串口連接正常
            std::cout << "串口連接正常" << std::endl;
        } else {
            // 串口連接異常
            std::cout << "串口連接異常" << std::endl;
        }
    }
};

// 使用示例
CISerialPort serial;
serial.Initialize("/dev/ttyUSB0", 115200);

MyOtherClass other_class(serial);  // 傳入串口對象
other_class.SomeMethod();

方案2:傳遞CISerialPort指針

cpp

class MyOtherClass {
private:
    CISerialPort* serial_port_;  // 指針
    
public:
    MyOtherClass(CISerialPort* serial_port) : serial_port_(serial_port) {}
    
    void SomeMethod() {
        if (serial_port_ && serial_port_->CheckConnection()) {
            // 串口連接正常
        }
    }
};

// 使用示例
CISerialPort serial;
MyOtherClass other_class(&serial);
other_class.SomeMethod();

方案3:使用單例模式(如果合適)

如果整個系統只需要一個串口實例:

cpp

// 在CISerialPort.h中修改
class CISerialPort {
private:
    static CISerialPort* instance_;  // 單例實例
    
public:
    static CISerialPort* GetInstance() {
        if (!instance_) {
            instance_ = new CISerialPort();
        }
        return instance_;
    }
    
    // 原有方法保持不變
    bool CheckConnection();
    bool IsConnected() const;
};

// 在CISerialPort.cpp中
CISerialPort* CISerialPort::instance_ = nullptr;

// 在其他類中使用
class MyOtherClass {
public:
    void SomeMethod() {
        CISerialPort* serial = CISerialPort::GetInstance();
        if (serial->CheckConnection()) {
            // 使用串口
        }
    }
};

方案4:使用全局變量(簡單但不推薦)

cpp

// 全局聲明
extern CISerialPort g_serial_port;

// 在其他類中使用
class MyOtherClass {
public:
    void SomeMethod() {
        if (g_serial_port.CheckConnection()) {
            // 使用串口
        }
    }
};

完整示例(推薦方案1)

MyOtherClass.h

cpp

#include "ci_serial_port.h"

class MyOtherClass {
private:
    CISerialPort& serial_port_;
    
public:
    MyOtherClass(CISerialPort& serial_port);
    void CheckAndUseSerial();
    void ProcessData();
};

MyOtherClass.cpp

cpp

#include "MyOtherClass.h"

MyOtherClass::MyOtherClass(CISerialPort& serial_port) 
    : serial_port_(serial_port) {
}

void MyOtherClass::CheckAndUseSerial() {
    // 檢查連接狀態
    if (!serial_port_.CheckConnection()) {
        std::cerr << "串口連接異常,無法處理數據" << std::endl;
        return;
    }
    
    // 連接正常,繼續處理
    ProcessData();
}

void MyOtherClass::ProcessData() {
    // 讀取串口數據
    auto data = serial_port_.ReadFromSerial();
    if (!data.empty()) {
        // 處理數據...
    }
}

main.cpp

cpp

#include "ci_serial_port.h"
#include "MyOtherClass.h"

int main() {
    // 創建串口對象
    CISerialPort serial_port;
    
    // 初始化串口
    if (!serial_port.Initialize("/dev/ttyUSB0", 115200)) {
        return -1;
    }
    
    // 創建其他類對象並傳入串口引用
    MyOtherClass processor(serial_port);
    
    // 使用
    while (true) {
        processor.CheckAndUseSerial();
        usleep(100000); // 100ms
    }
    
    return 0;
}

建議

  • 推薦方案1(傳遞引用):最安全,面向對象,易於測試
  • 如果多個地方需要訪問同一個串口,考慮方案3(單例)
  • 避免方案4(全局變量),不利於代碼維護和測試

選擇哪種方案取決於你的具體架構設計。