简单的Arduino类故障排除

时间:2013-12-17 14:18:11

标签: c++ class arduino

我正在尝试使用一个简单的类库来为Arduino工作并且正在努力。

图书馆 - .h

#ifndef ADS1X15_h
#define ADS1X15_h

#include "Arduino.h"

class ADS1X15
{
    protected:

    public:
        ADS1X15     ();
        void        begin(uint8_t i2cAddress);
        uint8_t     m_i2cAddress;
        uint8_t     m_test;

    private:
};

#endif

图书馆.cpp

#include "Arduino.h"
#include "ADS1X15.h"

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    uint8_t     m_i2cAddress = i2cAddress;
}

调用草图

#include <ADS1X15.h>

ADS1X15 ads; 

void setup(void) {
    Serial.begin(9600);
    ads.begin(66);
}

void loop(void) {
    Serial.print("Test1 ");
    Serial.println(ads.m_i2cAddress);
    Serial.print("Test2 ");
    Serial.println(ads.m_test);  
    while (1==1) {}
}

上面似乎应该打印99和66而不是0和0!?!?!

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是不正确的:

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;
}

它向构造函数声明了两个与类成员名称匹配的局部变量。您在ADS1X15::begin中有类似的错误。如果启用了警告,则应该收到关于隐藏成员变量或类似变量的局部变量的警告。

重写没有类型声明的那些,它们将更新您的类,而不是更新方法的局部变量。

ADS1X15::ADS1X15() {
    m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    m_i2cAddress = i2cAddress;
}

答案 1 :(得分:1)

在你的cpp:

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;

您正在重新声明公共成员,因此当您在构造函数中引用时,您将访问私有副本而不是公共类成员。

只需使用:

ADS1X15::ADS1X15() {
    m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    m_i2cAddress = i2cAddress;
}