有幾種解決方案,根據你的具體需求選擇:
方案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(全局變量),不利於代碼維護和測試
選擇哪種方案取決於你的具體架構設計。
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。