Serial.print'i ayrı bir sekme / başlık dosyasında arayın


9

Arduino 0022'de bir program yazıyorum.

Arama Serial.println, ana çizim kodumda iyi çalışıyor, ancak Menu.hayrı bir sekmede bulunan " " başlık dosyamda kullanmaya çalıştığımda bir hata alıyorum:

AppController.cpp dosyasında bulunan dosyada: 2:
Menu.h: 'Menu :: Menu ()'
yapıcısında: Menu.h: 15: hata: 'Serial' bu kapsamda bildirilmedi

Serial.printlnÇizim kodunun dışında nasıl kullanabilirim ?

Yanıtlar:


3

Üstbilgi dosyalarından işlevleri çağırmamalısınız. Başlık dosyaları, işlemci öncesi makroları (#define) tanımlamak ve diğer dosyalardaki değişkenlere / işlevlere başvurmak içindir.

Birden fazla C dosyası oluşturmalı ve bunları derleme zamanında birbirine bağlamanız gerekir. Başlık dosyası, her bir C dosyasına diğer C dosyalarının hangi işlev ve değişkenlere sahip olduğunu söylemek için kullanılır.

Arduino IDE'de birden fazla dosya kullanmak için, aralarında paylaşmak istediğiniz diğer dosyalarda bulunan işlevleri tanımlamak için en az 1 başlık dosyasına ihtiyacınız vardır. Ayrıca, tüm dosyalarda kullanmak istediğiniz global değişkenler.

Bu tanımların "harici" niteliğiyle nitelendirilmesi gerekir.

Ardından, işlevler için gerçek kodu ve değişken tanımlarını içeren bir veya daha fazla "pde" dosyası eklemeniz gerekir.

Örneğin, bir "mouse.h" dosyası var:

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

ve bir "mouse.pde" dosyası:

#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);
}

Sonra benim ana dosyada var:

#include "mouse.h"

ve "mouse.pde" içindeki işlevleri yerel dosyadaymış gibi çağırabilirim.


Teşekkürler Majenko, cevabınız bana acemi bir C ++ kodlayıcı olarak çok yardımcı oluyor ve kesinlikle tavsiyenizi kabul edeceğim. Buna rağmen, Seri sınıfın neden ana çizimin dışında kullanılamadığıyla daha çok ilgileniyordum. Şerefe!
aaaidan

3

@ Majenko'nun çok iyi cevabına alternatif olarak, işlevlerinizi kapsüllemek ve http://www.arduino.cc/en/Hacking/LibraryTutorial içinde açıklandığı gibi kütüphaneler klasörüne koymak için bir C ++ sınıfı oluşturabilirsiniz .

#include <Serial.h>Seri yöntemlerini çağırabilmeniz için sınıfınızın uygulama dosyasında olmanız gerekebilir . Seri işlevleri çağırmanın (özellikle okunan) açık yan etkileri olduğu için bu düşünceyi yapmaya dikkat ediyorum. Sınıfımda bir char * alan bir seri tanımlamayı ve seri arayüzden direkt olarak seri arayüzle etkileşime girmek yerine ana programımdan bayt aktarmayı tercih ederim.


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

Selam! Evet Serial.h veya benzeri için arduino kütüphane dizinine bir göz attım ve bulabildiğim tek şey ihtiyacım olan tanımları içermeyen HardwareSerial.h idi. Sonunda, Seri nesneyi bildiren <WProgram.h> çözümüne rastladım.
aaaidan

0

SerialÜstbilgi dosyalarında / sekmelerinde sınıf / nesne bildirimi için bir yol buldum :

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

Bu benim için süper temiz hissettirmiyor, ancak henüz bir dezavantajı yok gibi görünüyor.


1
Ah, Arduino 1.0 uyumlu olduğunuzdan emin olmak istiyorsanız, şartlı olarak eklemelisiniz veya ARDUINO derleme bayrağına bağlı olarak "Arduino.h" yazmalısınız. Ayrıca, cevabımdaki öğretici bağlantı her zaman sınıflarınıza WProgram.h eklemeyi söylüyor
vicatcu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.