对简单 Arduino 类进行故障排除

Troubleshooting Simple Arduino Class

本文关键字:故障 排除 简单 Arduino      更新时间:2023-10-16

我正在尝试让一个简单的类库为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?!?!

提前谢谢。

这是

不正确的:

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;
}

在你的 cpp 中:

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

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

只需使用:

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