我试图创建一个将结构存储在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
函数没有被声明。我还尝试将struct
和settings_read
放入Settings.ino
,这会产生更多错误。我对C来说是全新的,我无法在这里找到我做错的事。
答案 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)。