36

我正在尝试将类对象与 Arduino 一起使用,但我一直遇到问题。我要做的就是声明一个类并创建该类的对象。一个例子是什么?

4

7 回答 7

21

在 Arduino 1.0 上,编译得很好:

class A
{
  public:
   int x;
   virtual void f() { x=1; }
};

class B : public A
{
  public:
    int y;
    virtual void f() { x=2; }
};


A *a;
B *b;
const int TEST_PIN = 10;

void setup()
{
   a=new A(); 
   b=new B();
   pinMode(TEST_PIN,OUTPUT);
}

void loop()
{
   a->f();
   b->f();
   digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW);
}
于 2012-10-06T15:14:15.540 回答
14

一个关于如何为 Arduino 平台创建库的优秀教程。库基本上是一个类,所以它应该向您展示它是如何完成的。

在 Arduino 上,您可以使用类,但有一些限制:

  • 没有新的和删除的关键字
  • 没有例外
  • 没有 libstdc++,因此没有标准函数、模板或类

你还需要为你的类创建新文件,你不能只在你的主草图中声明它们。重新编译库时,您还需要关闭 Arduino IDE。这就是为什么我使用 Eclipse 作为我的 Arduino IDE。

于 2009-11-16T16:04:11.540 回答
6

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955状态:

默认情况下,Arduino IDE 和库不使用 operator new 和 operator delete。它确实支持 malloc() 和 free()。所以解决办法就是自己实现new和delete操作符,来使用这些功能。

代码:

#include <stdlib.h> // for malloc and free
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); }

这让你创建对象,例如

C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory

问候,坦伯格

于 2010-01-14T14:09:06.157 回答
4

不久前我创建了这个简单的。我面临的主要挑战是创建一个良好的构建环境 - 一个无需使用 GUI 即可编译和链接/部署所有内容的 makefile。对于代码,这是标题:

class AMLed
{
    private:
          uint8_t _ledPin;
          long _turnOffTime;

    public:
          AMLed(uint8_t pin);
          void setOn();
          void setOff();
          // Turn the led on for a given amount of time (relies
          // on a call to check() in the main loop()).
          void setOnForTime(int millis);
          void check();
};

这是主要来源

AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0)
{
    pinMode(_ledPin, OUTPUT);
}

void AMLed::setOn()
{
    digitalWrite(_ledPin, HIGH);
}

void AMLed::setOff()
{
    digitalWrite(_ledPin, LOW);
}

void AMLed::setOnForTime(int p_millis)
{
    _turnOffTime = millis() + p_millis;
    setOn();
}

void AMLed::check()
{
    if (_turnOffTime != 0 && (millis() > _turnOffTime))
    {
        _turnOffTime = 0;
        setOff();
    }
}

这里的格式更漂亮:http: //amkimian.blogspot.com/2009/07/trivial-led-class.html

要使用,我只需在 .pde 文件中执行以下操作:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
于 2009-11-16T15:57:16.983 回答
1

我的Webduino 库全部基于一个 C++ 类,该类在 Arduino 以太网扩展板之上实现了一个 Web 服务器。我在一个任何 Arduino 代码都可以#include 的 .h 文件中定义了整个类。随意查看代码以了解我是如何做到的……我最终只是将其全部定义为内联,因为没有真正的理由使用 Arduino IDE 单独编译对象。

于 2009-11-18T02:24:13.760 回答
1

你能举例说明什么不起作用吗?您可能知道,Wiring 语言基于 C/C++,但并非所有 C++ 都受支持

是否允许您在 Wiring IDE 中创建类,我不确定(我的第一个 Arduino 现在在邮件中)。我确实知道,如果您编写了一个 C++ 类,使用AVR-GCC对其进行编译,然后使用AVRDUDE将其加载到您的 Arduino上,它会起作用。

于 2009-11-15T04:26:10.603 回答
0

这个页面上,Arduino 草图定义了几个结构(加上几个方法),然后在设置循环和主循环中调用它们。简单到可以解释,即使对于像我这样几乎没有文化的程序员也是如此。

于 2009-12-07T03:43:08.777 回答