Викличте Serial.print в окремій вкладці / файлі заголовка


9

Я пишу програму в Arduino 0022.

Виклик Serial.printlnдобре працює в моєму головному коді ескізу, але коли я намагаюся його використовувати у своєму файлі заголовка " Menu.h", який знаходиться на окремій вкладці, я отримую помилку:

У файлі, включеному з AppController.cpp: 2:
Menu.h: У конструкторі "Menu :: Menu ()":
Menu.h: 15: error: "Serial" не було оголошено в цій області

Як я можу використовуватись Serial.printlnпоза кодом ескізу?

Відповіді:


3

Ви не повинні викликати функції з файлів заголовків. Файли заголовків призначені для визначення макросів попереднього процесора (#define) та посилань на змінні / функції інших файлів.

Вам слід створювати декілька файлів C і з'єднувати їх між собою під час компіляції. Файл заголовка використовується для того, щоб повідомити кожному файлу C, які функції та змінні мають інші файли C.

Для використання декількох файлів в Arduino IDE вам потрібно щонайменше 1 файл заголовка для опису функцій, які є в інших файлах, якими ви хочете поділитися між ними. Також будь-які глобальні змінні, які ви хочете використовувати в усіх файлах.

Ці визначення слід кваліфікувати за допомогою "зовнішнього" атрибута.

Тоді вам потрібно додати один або кілька файлів "pde", який містить фактичний код та визначення змінних для функцій.

Наприклад, у мене є файл "mouse.h":

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

і файл "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);
}

Тоді в головному файлі я маю:

#include "mouse.h"

і я можу викликати функції, що знаходяться в "mouse.pde" так, ніби вони були у локальному файлі.


Дякую Маєнко, ваша відповідь дуже допомагає мені як початківцю програмісту C ++, і я обов'язково буду приймати вашу пораду. Незважаючи на це, мене більше цікавило, чому серійний клас недоступний поза основним ескізом. Ура!
aaaidan

3

Як альтернатива дуже гарній відповіді @ Majenko, ви можете зробити клас C ++, щоб інкапсулювати свої функції і помістити його в папку "Бібліотеки", як описано в http://www.arduino.cc/en/Hacking/LibraryTutorial .

Вам може знадобитися #include <Serial.h>у файлі реалізації вашого класу, щоб мати можливість викликати послідовні методи. Я буду обережно робити це thg, оскільки очевидно є побічні ефекти для виклику послідовних функцій (читайте зокрема). Я вважаю за краще визначити метод у своєму класі, який приймає char * і передає байти з послідовного інтерфейсу в нього з моєї основної програми, а не безпосередньо взаємодіє з послідовним інтерфейсом.


#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

Привіт! Так, я оглянувся в каталозі бібліотеки arduino для Serial.h або подібного, і все, що я міг знайти, це HardwareSerial.h, який не містив потрібних мені визначень. Врешті-решт я натрапив на рішення про включення <WProgram.h>, яке, схоже, оголошує серійний об'єкт.
aaaidan

0

Я знайшов спосіб Serialоголосити клас / об’єкт у заголовкових файлах / вкладках:

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

Це не здається мені дуже чистою, але, здається, ще не було недоліків.


1
Ага, якщо ви хочете переконатися, що ви сумісні з Arduino 1.0, вам слід умовно включити це або "Arduino.h", залежно від прапора компіляції ARDUINO, детально подивіться мою відповідь. Також посилання на підручник у моїй відповіді говорить про те, щоб завжди включати WProgram.h у свої класи
vicatcu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.