utiles una timelib para modificar librerias libreria descargar crear como c++ include arduino header-files arduino-ide

c++ - una - librerias de arduino pdf



forma correcta de incluir archivos.cpp y.h en un boceto de Arduino (1)

Primero, el problema:

archivo de boceto principal:

char foo; // required to clean up some other problems #include <Arduino.h> // tried it in desperation, no help #include "a.h" void setup(){ Serial.begin(9600); Serial.println("/nTest begins"); for (int num = -1; num < 1; num++){ Serial.print(num); if (isNegative(num)){ Serial.println(" is negative"); } else { Serial.println(" is NOT negative"); } } } void loop(){}

// ah

#ifndef H_A #define H_A boolean isNegative(int x); // Err#1 int anotherOdity(); #endif // H_A

// a.cpp

#include "a.h" int isNegative(int x){ Serial.println("I can''t print this from inside my INCLUDE FILE"); //Err#2 if (x<0) return true; return false; } int anotherOdity(){ char ch[5]; memcpy(ch,"1",1); //doesn''t work, memcpy not declared // Err#3 }

Lo anterior, como está, no se compila y estos son los errores que obtengo:

In file included from a.cpp:1: a.h:4: error: ''boolean'' does not name a type a.cpp: In function ''int isNegative(int)'': a.cpp:4: error: ''Serial'' was not declared in this scope a.cpp: In function ''int anotherOdity()'': a.cpp:11: error: ''memcpy'' was not declared in this scope

El primer problema es el tipo booleano, parece sufrir algún cambio de nombre que hace el entorno Arduino, pero generalmente lo soluciona el char foo; en el archivo principal. Y en ciertas situaciones, lo es. Pero usar ese tipo en el archivo .cpp genera este error.

Puedo ver que los errores 2 y 3 están relacionados, pero ¿cómo puedo obtener estos en el alcance? Me doy cuenta de que parte del problema es probablemente el #include (tal vez) porque Serial y memcpy todavía no están definidos / declarados. Intenté incluir la biblioteca Arduino.h , pero eso no ayudó. En realidad, sí ayudó al problema booleano, pero solo en el caso de poner todo en el archivo .h (como expongo más adelante), no ayuda en el ejemplo anterior.

Si pongo los tres archivos juntos y tengo todo en el archivo de boceto principal ( .ino ), funciona como debería. Pero la idea aquí es que quiero descifrar un código y hacer que mi boceto sea más legible.

Lo más cerca que llegué a una solución se encontró aquí: http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/ donde, después de ejecutar mis propias pruebas, determiné que si poner TODO en un archivo .h , ¡funciona!

Por ejemplo, si dejo inalterado el archivo de boceto principal, si a.cpp y creo ah solo (como sigue) ¡funciona!

#ifndef H_A #define H_A boolean isNegative(int x){ Serial.println("I can''t print this from inside my INCLUDE FILE"); if (x<0) return true; return false; } int anotherOdity(){ char ch[5]; memcpy(ch,"1",1); //doesn''t work, memcpy not declared } #endif // H_A

Esto soluciona el problema booleano (bueno ... todavía necesito Arduino.h o char foo; ) y soluciona los problemas de alcance.

Pero solo se siente mal.

No se trata de crear una biblioteca de funciones estándar que pueda usar en varios bocetos, se trata de dividir mi código en fragmentos más pequeños (legibles) y mantenerlos todos juntos en la carpeta del proyecto. Quiero hacer esto de la manera más correcta posible, parece ser que estoy limitado por el IDE. Estoy seguro de que tengo una comprensión adecuada de cómo juntar un encabezado y .cpp archivo .cpp asociado (espero que no haya funcionado bien esa parte).

Soy totalmente autodidacta con todo C / C ++ y solo me he metido en la programación de micros muy recientemente.

He investigado esto a través de las profundidades de google y estoy continuamente quedándome corto.

Sin recurrir a hacks y mantenerlo simple para gente como yo, ¿cómo puedo armar mejor los ejemplos anteriores para que Arduino IDE / gcc lo compile?

editar: ¡Pensé que incluiría solo ALGUNAS de las pestañas que tengo abiertas aquí para mostrar que realmente hice una investigación sobre esto!

http://arduino.cc/en/Reference/Include

http://arduino.cc/en/Hacking/LibraryTutorial

http://forum.arduino.cc/index.php/topic,124904.msg938861.html#msg938861

http://forum.arduino.cc/index.php?topic=84412.0 (aquí es donde encontré la solución char foo; )

http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/

Incluyendo archivos .cpp

Mantener todas las bibliotecas en el directorio de bocetos de Arduino

C ++ Header y CPP incluye


La razón por la que no funciona es que debe incluir algo en sus archivos ah o a.cpp.

Intenta esto en tu archivo ah y todo debería funcionar.

#ifndef H_A #define H_A #include <Arduino.h> //needed for Serial.println #include <string.h> //needed for memcpy ...

La razón de esto es que puede pensar en el compilador compilando por separado cada archivo cpp. Un #include es de hecho solo una copia automática de pegar. Cuando el compilador viene a compilar un.cpp, no sabe que existe Serial.println (), porque no se definió en ah, que es el único otro texto que aparece en a.cpp. La razón por la que funciona cuando lo pones todo en el encabezado es que en tu archivo cpp principal has incluido Arduino.h antes de incluir ah, por lo que una vez que esos #includes han sido copiados, es como si acabaras de escribir el código allí. El primer lugar.

Puedes simplemente escribir todo tu código en los encabezados, pero no es aconsejable por varias razones, incluida la eficiencia en tiempo de compilación (pero como un programa arduino solo puede ser de 32k, ¡no creo que los tiempos de compilación vayan a ser demasiado largos!)