【问题标题】:C++ Method Definition & Variable DeclarationC++ 方法定义和变量声明
【发布时间】:2016-05-12 15:25:34
【问题描述】:

我正在尝试通过创建同时具有 .h 和 .cpp 文件的类将我的 arduino 代码库从单个“ino”文件拆分为适当的 c++ 程序。我遇到了一些我无法解决的错误。我希望我错过了一些简单的东西。

在运行“Arduino IDE for Visual Studio”插件的 Visual Studio 中编译时,出现以下错误:

7:8: 错误:“MPU6050 类”没有名为“计时器”的成员

30:5:错误:“int MPU6050::MPU6050_read(int, uint8_t*, int)”的原型与“MPU6050”类中的任何内容都不匹配

我在这里错过了什么?

.h

#ifndef MPU6050_H
#define MPU6050_H


class MPU6050
{

private:  // Vars
    uint32_t timer;  // Hold the value of the timer used for the complementary filter
    int error;

public:  // Methods
    MPU6050();
    ~MPU6050();
    
    void read_acc_gyr();
    float const * const getXa();
    float const * const getYa();
    float const * const getXvel();
    float const * const getYvel();
    float const * const getZvel();
    float const * const getZang();
    double const * const getDt();

private:
    void test_gyr_acc();
    void MPU6050_init();
    void printGyroValues();
    void calibrateGyro();
    int MPU6050_write(int start, const uint8_t *pData, int size);
    int MPU6050_read(int start, uint8_t *buffer, int size);
    int MPU6050_write_reg(int reg, uint8_t data);
};

#endif

.cpp

#include "MPU6050.h"
#include "Arduino.h"
#include "MPU6050Definitions.h"

MPU6050::MPU6050()
{
    timer = 0;  // Always start the timer at 0
    error = 1;

    Serial.println("Testing Gyro");
    test_gyr_acc();
}

MPU6050::~MPU6050()
{

}

int MPU6050::MPU6050_read(int start, uint8_t *buffer, int size)
{
    int i, n, error;

    Wire.beginTransmission(MPU6050_I2C_ADDRESS);
    n = Wire.write(start);
    if (n != 1)
        return (-10);

    n = Wire.endTransmission(false);    // hold the I2C-bus
    if (n != 0)
        return (n);

    // Third parameter is true: relase I2C-bus after data is read.
    Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
    i = 0;
    while (Wire.available() && i<size)
    {
        buffer[i++] = Wire.read();
    }
    if (i != size)
        return (-11);

    return (0);  // return : no error
}

void MPU6050::test_gyr_acc()
{
    uint8_t c = 0;

    error = MPU6050_read(MPU6050_WHO_AM_I, &c, 1);
    if (error != 0) {
        while (true) {
            digitalWrite(13, HIGH);
            delay(300);
            digitalWrite(13, LOW);
            delay(300);
        }
    }
}

MPUT6050Definitions.h 包含我的所有常量,如下所示:(还有更多我认为与包含无关的#defines)

#pragma once

//All the values to setup the MPU6050 gyro/accelermeter

#define MPU6050_AUX_VDDIO          0x01   // R/W
#define MPU6050_SMPLRT_DIV         0x19   // R/W
#define MPU6050_CONFIG             0x1A   // R/W
#define MPU6050_GYRO_CONFIG        0x1B   // R/W

【问题讨论】:

  • 评论你的timer = 0; // Always start the timer at 0,看看error是否有问题
  • 我很确定编译器使用了与您在头文件中显示的不同的类定义。将一些文件与旧版本混合在一起?此外,当您遇到此类错误时,最好用#pragma 一次替换此#ifdef 标头障碍(尽管我认为这不是问题所在)。您是否禁用了预编译头文件?还要设置您的编译器以提供包含的所有头文件的调试输出。检查它是否真的是它使用的类定义。对 MPU6050_H 进行文本搜索,它应该只在该单个 .h 文件中弹出。
  • @YassinNasri 注释掉计时器变量导致错误消失,这导致我专注于解决我的问题的另一个错误。
  • @philipp 如何禁用预编译头文件?

标签: c++ arduino header-files


【解决方案1】:

看来我犯了一个简单的错误。

列表中还有一些错误是unknown declaration of type uint_32,它会自行传播导致我之前看到的错误。我包含了 Arduino.h 标头,它解决了 uint_32 问题,导致其余代码按预期编译。

故事的寓意是不要试图自上而下地修复你的错误。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多