Appelez Serial.print dans un fichier onglet / en-tête distinct

9

J'écris un programme en Arduino 0022.

L'appel Serial.printlnfonctionne correctement dans mon code d'esquisse principal, mais lorsque j'essaie de l'utiliser dans mon fichier d'en-tête "Menu.h ", qui se trouve dans un onglet séparé, j'obtiens une erreur:

Dans le fichier inclus depuis AppController.cpp: 2:
Menu.h: Dans le constructeur 'Menu :: Menu ()':
Menu.h: 15: erreur: 'Serial' n'a pas été déclaré dans cette étendue

Comment puis-je utiliser en Serial.printlndehors du code d'esquisse?

aaaidan
la source

Réponses:

3

Vous ne devez pas appeler de fonctions à partir de fichiers d'en-tête. Les fichiers d'en-tête servent à définir les macros de pré-processeur (#define) et les références aux variables / fonctions dans d'autres fichiers.

Vous devez créer plusieurs fichiers C et les lier ensemble au moment de la compilation. Le fichier d'en-tête est utilisé pour indiquer à chaque fichier C les fonctions et les variables des autres fichiers C.

Pour utiliser plusieurs fichiers dans l'IDE Arduino, vous avez besoin d'au moins 1 fichier d'en-tête pour décrire les fonctions qui se trouvent dans les autres fichiers que vous souhaitez partager entre eux. En outre, toutes les variables globales que vous souhaitez utiliser dans tous les fichiers.

Ces définitions doivent être qualifiées avec l'attribut "externe".

Ensuite, vous devez ajouter un ou plusieurs fichiers "pde" qui contiennent le code réel et les définitions des variables pour les fonctions.

Par exemple, j'ai un fichier "mouse.h":

extern void mouse_read(char *,char *, char *);
extern void mouse_init();

et un fichier "mouse.pde":

#include <ps2.h>

PS2 mouse(6,5);

void mouse_read(char *stat,char *x, char *y)
{
  mouse.write(0xeb);  // give me data!
  mouse.read();      // ignore ack
  *stat = mouse.read();
  *x = mouse.read();
  *y = mouse.read();
}

void mouse_init()
{
  mouse.write(0xff);  // reset
  mouse.read();  // ack byte
  mouse.read();  // blank */
  mouse.read();  // blank */
  mouse.write(0xf0);  // remote mode
  mouse.read();  // ack
  delayMicroseconds(100);
}

Ensuite, dans mon fichier principal, j'ai:

#include "mouse.h"

et je peux appeler les fonctions qui sont dans "mouse.pde" comme si elles étaient dans le fichier local.

Majenko
la source
Merci Majenko, votre réponse est très utile pour moi en tant que codeur C ++ novice, et je vais certainement adopter vos conseils. Malgré cela, j'étais plus intéressé par la raison pour laquelle la classe Serial n'est pas disponible en dehors du croquis principal. À votre santé!
aaaidan
3

Comme alternative à la très bonne réponse de @ Majenko, vous pouvez créer une classe C ++ pour encapsuler vos fonctions et la placer dans le dossier des bibliothèques comme décrit dans http://www.arduino.cc/en/Hacking/LibraryTutorial .

Vous devrez peut-être #include <Serial.h>dans le fichier d'implémentation de votre classe pour pouvoir appeler les méthodes Serial. Je ferais attention à ne pas le faire car il y a évidemment des effets secondaires à appeler des fonctions série (lire en particulier). Je préfère définir une méthode dans ma classe qui prend un char * et transmet des octets de l'interface série à partir de mon programme principal, plutôt que de la faire interagir directement avec l'interface série.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
vicatcu
la source
Salut! Oui, j'ai jeté un coup d'œil dans le répertoire de la bibliothèque arduino pour Serial.h ou similaire, et tout ce que j'ai pu trouver était HardwareSerial.h, qui ne contenait pas les définitions dont j'avais besoin. À la fin, je suis tombé sur la solution d'inclure <WProgram.h>, qui semble déclarer l'objet Serial.
aaaidan
0

J'ai trouvé un moyen de Serialdéclarer la classe / l'objet dans les fichiers / onglets d'en-tête:

#include <WProgram.h>  // at the top of the file

Cela ne me semble pas très propre, mais cela ne semble pas avoir encore d'inconvénients.

aaaidan
la source
1
Ah oui, si vous voulez vous assurer que vous êtes compatible Arduino 1.0, vous devez inclure conditionnellement cela ou "Arduino.h" selon le drapeau de compilation ARDUINO voir ma réponse pour plus de détails. De plus, le lien du tutoriel dans ma réponse dit de toujours inclure WProgram.h dans vos classes
vicatcu