从Arduino中的另一个文件访问c ++对象

时间:2015-03-13 20:26:29

标签: c++ class arduino external

在我的Arduino文件中,TimerTest.ino

#include "Arduino.h"
#include "Pulse.h"
#include <elapsedMillis.h>

elapsedMillis timeElapsed ; 
Pulse trigger(45,60) ; //45 is pin number, 60 is pulse interval in msec

当我定义Pulse.cpp时

#include "Arduino.h"
#include "Pulse.h"

Pulse::Pulse(int pin, long interval)
{
  _pin = pin ;
  pinMode(_pin, OUTPUT);
  _interval = interval);
}

void Pulse::PulseOut()
{
  if(timeElapsed > _previousTime + _interval)
    digitalWrite(_pin,LOW);
} 

我收到编译错误,说timeElapsed不在此文件的此范围内, 我不太了解c ++以了解访问机制,有人可以指出我正确的解决方案。

2 个答案:

答案 0 :(得分:0)

在草图中声明全局变量elapsedMillis timeElapsed;时,它只对该文件可见,而不对其他文件可见。

在Pulse.cpp中,在包含之后,您可以添加语句

#include <elapsedMillis.h>

extern elapsedMillis timeElapsed;

告诉C ++编译器,在另一个文件中定义了一个全局变量,您要在此文件中使用该变量。然后,编译器将知道不为它分配新的存储空间,而是为它创建一个占位符,它将在链接阶段粘合在一起,指向草图中创建的存储。

答案 1 :(得分:0)

一般来说,全局变量并不是一个好主意。

根据你想用Pulse类和timeElapsed做什么,你有多种选择:

  • 将timeElapsed作为参数传递给构造函数

  • 将timeElapsed作为参数传递给PulseOut

  • make timeElapsed Pulse对象的字段(公共或私有getter / setter)

  • 根本不使用OOP:如果您更熟悉C,请坚持使用它,您将有更好的机会生成可以根据需要运行的代码,并且更容易调试。恕我直言,Arduino不是学习OOP的最佳选择,因为它使得调试比依赖普通PC编程的典型OOP学习路径更难。