找不到.ino中声明的函数

时间:2015-06-01 19:07:29

标签: c arduino

我试图创建一个将结构存储在EEPROM存储器中的简单应用程序,并在启动时从EEPROM读取存储的结构,然后根据存储的数据执行其余结构。

这是我的主要ino文件:

extern "C" {
    #include "Structs.h"
}

Settings settings;

void setup()
{
    settings = settings_read();
}

void loop()
{

  /* add main program code here */

}

这是Structs.h文件:

#ifndef _STRUCTS_h
#define _STRUCTS_h

#if defined(ARDUINO) && ARDUINO >= 100
    #include "arduino.h"
#else
    #include "WProgram.h"
#endif

typedef struct {
    byte lastCountry;
    byte lastMode;
} Settings;

#endif

这是Settings.ino文件:

#include <EEPROM.h>

Settings settings_read() {
    byte country, mode;
    Settings settings;

    country = EEPROM.read(0);
    mode = EEPROM.read(1);

    settings = {
        country,
        mode
    };

    return settings;
}

这是编译器错误:

Compiling 'Stoplicht' for 'Arduino Uno'
Stoplicht.ino:5:1: error: 'Settings' does not name a type
Stoplicht.ino:In function 'void setup()'
Stoplicht.ino:9:27: error: 'settings_read' was not declared in this scope
Error compiling

我尝试了许多不同的东西来实现这个目标。我尝试将Settings.ino中的代码放入.C文件中。这给了更多的错误,它说EEPROM.h函数没有被声明。我还尝试将structsettings_read放入Settings.ino,这会产生更多错误。我对C来说是全新的,我无法在这里找到我做错的事。

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,Arduino的 langagedeprédilection是C ++,而不是C.

遵循C ++构建应用程序的方式似乎是个好主意。忘记C语言,它通常包含缺少适当的C语言编程机制的解决方法。(不是说C ++是完美的......)。

所以我重新构建了示例代码,现在展示了如何为Settings类型定义和使用库。

首先从主ino文件

开始
// StopLicht.ino

#include "Settings.h"

Settings settings;

void setup()
{
   settings.read(); // doing it the OO way
}

void loop()
{
   // code here. does some stuff with 
   // settings.mode and settings.country
}

Settings类型被定义为具有2个字段的struct,以及(此处为C ++)成员函数read(),其作用于Settings

// Settings.h

#ifndef SETTINGS_H_INCLUDED
#define SETTINGS_H_INCLUDED

struct Settings 
{
  byte country; 
  byte mode;

  void read();   // to get values from EEPROM
};

#endif

它在ino文件中实现

// Settings.ino

#include <EEPROM.h>

#include "Settings.h"

void Settings::read() 
{
     country = EEPROM.read(0);
     mode    = EEPROM.read(1);
};

备注:Settings当然可以写成而不是 struct 。在这种情况下没什么大不了的。

答案 1 :(得分:1)

它是“Arduino.h”,而不是“arduino.h”所以你应该改为:

#ifndef _STRUCTS_h
#define _STRUCTS_h

#if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
#else
    #include "WProgram.h"
#endif

typedef struct {
    byte lastCountry;
    byte lastMode;
} Settings;

#endif

下一个问题是你的尴尬包含语法?!我不知道这个外部“C”的东西,但它应该只使用:

#include "Structs.h"

没有任何板块。

就像提示一样,当使用多个文件Arduino IDE时,它缺少自动完成功能,其* .ino垃圾会让您的项目变得混乱,并确保您不时遇到编译问题。对于多文件项目,我建议使用带有默认c / ++的biicode(http://docs.biicode.com/arduino/gettingstarted.html)。