Panggil Serial.print di file tab / header terpisah


9

Saya sedang menulis sebuah program di Arduino 0022.

Memanggil Serial.printlnberfungsi dengan baik di kode sketsa utama saya, tetapi ketika saya mencoba menggunakannya di file header saya " Menu.h", yang ada di tab terpisah, saya mendapatkan kesalahan:

Dalam file termasuk dari AppController.cpp: 2:
Menu.h: Dalam konstruktor 'Menu :: Menu ()':
Menu.h: 15: error: 'Serial' tidak dideklarasikan dalam lingkup ini

Bagaimana saya bisa menggunakan di Serial.printlnluar kode sketsa?

Jawaban:


3

Anda seharusnya tidak memanggil fungsi dari dalam file header. File header adalah untuk mendefinisikan makro pra-prosesor (#define) dan referensi ke variabel / fungsi di file lain.

Anda harus membuat beberapa file C dan menautkannya bersamaan pada waktu kompilasi. File header digunakan untuk memberi tahu setiap file C apa fungsi dan variabel yang dimiliki file C lainnya.

Untuk menggunakan banyak file di Arduino IDE, Anda memerlukan setidaknya 1 file header untuk menjelaskan fungsi-fungsi yang ada di file lain yang ingin Anda bagikan di antaranya. Juga, variabel global apa pun yang ingin Anda gunakan di semua file.

Definisi-definisi ini harus memenuhi syarat dengan atribut "eksternal".

Maka Anda perlu menambahkan satu atau lebih file "pde" yang berisi kode aktual dan definisi variabel untuk fungsi.

Misalnya, saya punya file "mouse.h":

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

dan file "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);
}

Kemudian di file utama saya, saya punya:

#include "mouse.h"

dan saya dapat memanggil fungsi-fungsi yang ada di "mouse.pde" seolah-olah mereka berada di file lokal.


Terima kasih Majenko, jawaban Anda sangat membantu saya sebagai pemula C ++ coder, dan saya pasti akan mengadopsi saran Anda. Meski begitu, saya lebih tertarik pada mengapa kelas Serial tidak tersedia di luar sketsa utama. Bersulang!
aaaidan

3

Sebagai alternatif untuk jawaban yang sangat bagus dari @ Majenko, Anda bisa membuat kelas C ++ untuk merangkum fungsi Anda dan meletakkannya di folder perpustakaan seperti yang dijelaskan dalam http://www.arduino.cc/en/Hacking/LibraryTutorial .

Anda mungkin perlu #include <Serial.h>di file implementasi kelas Anda untuk dapat memanggil metode Serial. Saya akan berhati-hati melakukan hal ini karena ada efek samping yang jelas untuk memanggil fungsi Serial (baca khususnya). Saya lebih suka mendefinisikan metode di kelas saya yang mengambil char * dan mengirimkan byte dari antarmuka serial ke dalamnya dari program utama saya, daripada memiliki itu berinteraksi dengan antarmuka serial secara langsung.


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

Hai! Ya saya telah melihat-lihat di direktori perpustakaan arduino untuk Serial.h atau serupa, dan yang bisa saya temukan adalah HardwareSerial.h, yang tidak mengandung definisi yang saya butuhkan. Pada akhirnya saya menemukan solusi termasuk <WProgram.h>, yang tampaknya menyatakan objek Serial.
aaaidan

0

Saya menemukan cara agar Serialkelas / objek dideklarasikan di file header / tab:

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

Ini tidak terasa sangat bersih bagi saya, tetapi tampaknya belum memiliki kekurangan.


1
Ah benar, jika Anda ingin memastikan Anda kompatibel dengan Arduino 1.0, Anda harus memasukkannya secara kondisional atau "Arduino.h" tergantung pada flag kompilasi ARDUINO lihat jawaban saya untuk detailnya. Juga, tautan tutorial dalam jawaban saya mengatakan untuk selalu menyertakan WProgram.h di kelas Anda
vicatcu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.