首页 > 解决方案 > C++ 字符串不在类中连接

问题描述

我尝试编写一个小程序来控制与树莓派 3B+ 上的两个 ds18b20 温度传感器连接的泵和阀门。我为泵和阀门定义了一个类,将来会添加更多的泵和阀门,我还为通过 1 根电线连接的 ds18b20 传感器创建了一个类。传感器可以通过“文件”读取,因此有一个基本目录string baseDir = "/sys/bus/w1/devices/";,后跟设备 IDstring tSensor1 = "28-3c01a81688f4";和温度“文件” string tempFile = "/w1_slave";,完整路径应如下所示/sys/bus/w1/devices/28-3c01a81688f4/w1_slave

但我得到的是这个TestSensor1= Error reading file at /sys/bus/w1/devices//w1_slave设备丢失了,对于TestSensor2= Error reading file at /sys/bus/w1/devices//w1_slave.

代码直接在 rPi 上编译,g++ -Wall -o oww ofen-warmwasser.cpp -lwiringPi 这是我的代码

#include <wiringPi.h> // library to access the GPIO Pins on a raspberryPI !!deprecated!!
#include <iostream>   // cout
#include <fstream>    // file stream access
#include <string>     // string class
#include <sstream>    // string stream needed for file access to put data into string

//... code skipped ...

class temperaturSensor {
  private:
    string device;
    string baseDir = "/sys/bus/w1/devices/";
    string tempFile = "/w1_slave";
    string path = baseDir + device + tempFile;
    stringstream buffer;
    string data;
    string strTemp;
    double temp = 987.6;
  public:
    // constructor declaration
    temperaturSensor(string str);
    // methodes
    double temperatur() {
      //cout << "----->>>> " << device << " ----->>>> " << path << endl;
      ifstream infile(path);
      if (infile) {
        buffer << infile.rdbuf();
        data = buffer.str();
        infile.close();
      }
      else {
        infile.close();
        cout << "Error reading file at " << path << endl;
        return -100;
      }
      size_t crcCheck = data.find("YES");
      if (crcCheck == string::npos) {
        cout << "CRC fail not reading temperatur" << endl;
        return -101;
      }
      size_t TempPos = data.find("t=");
      if (TempPos == string::npos) {
        cout << "failed to find value -> abort!" << endl;
        return -102;
      }
      strTemp = data.substr(TempPos+2);
      temp = stod(strTemp)/1000;
      return temp;
    }
};

// constructor
    temperaturSensor::temperaturSensor(string str) {
       device = str;
    }

int main(void) {
  // test setup
  pump boilerpumpe(21);
  valve boilervalve(28);
  string tSensor1 = "28-3c01a81688f4";
  temperaturSensor testSensor1(tSensor1);
  temperaturSensor testSensor2("28-3c01a816d9c1");
  while (true)
  {
    boilerpumpe.on();
    boilervalve.close();
    cout << "TestSensor1= " << testSensor1.temperatur() << "°C \nTestSensor2= " << testSensor2.temperatur() << "°C" << endl;
    delay(5*1000);
    boilerpumpe.off();
    boilervalve.open();
    delay(5*1000);
  }
  return 0;
}

正如您在代码中看到的那样,我尝试了不同的方法,从将string device;变量从 private: 声明为 public: 从类的末尾到开头,当我cout正确显示设备变量时,我认为问题出在此处string path = baseDir + device + tempFile;,我也试过string path = baseDir.append(device);但没有成功

任何帮助表示赞赏,如果需要更多信息,请告诉我什么,我尝试提供

谢谢蚀刻

标签: c++stringclassraspberry-piconcatenation

解决方案


在您的班级声明中:

string device;

此类成员默认初始化为空字符串。

string baseDir = "/sys/bus/w1/devices/";

此类成员默认初始化为给定的字符串。

string tempFile = "/w1_slave";

此类成员默认初始化为给定的字符串。

string path = baseDir + device + tempFile;

并且这个类成员被初始化为组合字符串。请记住,这device是一个空字符串,因此路径最终设置为“/sys/bus/w1/devices//w1_slave”,这是您的代码最终尝试打开的内容,但失败了。

在你的类的构造函数中:

   device = str;

这为 设置了一个新值device。然而为时已晚,因为另一个类成员,path特别是已经初始化了。在设置值之后,它不会再次初始化device。C++ 不能以这种方式工作。

这里最简单的解决方法是让您的构造函数使用其初始化部分按顺序初始化所有类成员。


推荐阅读