別のタブ/ヘッダーファイルでSerial.printを呼び出す


9

Arduino 0022でプログラムを書いています。

呼び出しSerial.printlnはメインのスケッチコードでは問題なく機能しますMenu.hが、別のタブにあるヘッダーファイル " "で使用しようとすると、エラーが発生します。

AppController.cpp:2からインクルードされたファイル:
Menu.h:コンストラクター 'Menu :: Menu()':
Menu.h:15:エラー: 'Serial'はこのスコープで宣言されていません

Serial.printlnスケッチコード以外で使用するにはどうすればよいですか?

回答:


3

ヘッダーファイル内から関数を呼び出すことはできません。ヘッダーファイルは、プリプロセッサマクロ(#define)と他のファイルの変数/関数への参照を定義するためのものです。

複数のCファイルを作成し、コンパイル時にそれらをリンクする必要があります。ヘッダーファイルは、各Cファイルに他のCファイルが持つ関数と変数を通知するために使用されます。

Arduino IDEで複数のファイルを使用するには、それらの間で共有する他のファイルにある関数を記述するために、少なくとも1つのヘッダーファイルが必要です。また、すべてのファイルで使用するグローバル変数。

これらの定義は、「外部」属性で修飾する必要があります。

次に、実際のコードと関数の変数定義を含む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"にある関数を、ローカルファイルにあるかのように呼び出すことができます。


Majenkoに感謝します。あなたの答えは、初心者のC ++コーダーとして私にとって非常に役に立ちます。私は間違いなくあなたのアドバイスを採用します。それでも、なぜメインクラスの外ではSerialクラスが利用できないのかということに、もっと興味がありました。乾杯!
aaaidan、2011年

3

@Majenkoの非常に良い答えの代わりに、C ++クラスを作成して関数をカプセル化し、http: //www.arduino.cc/en/Hacking/LibraryTutorialで説明されているようにライブラリーフォルダーに配置することもできます

#include <Serial.h>Serialメソッドを呼び出せるようにするには、クラスの実装ファイルで必要になる場合があります。シリアル関数の呼び出しには明らかに副作用があるので(特に読んで)、私はこの考え方を慎重に実行します。シリアルインターフェイスと直接やり取りするのではなく、char *を受け取り、シリアルインターフェイスのバイトをメインプログラムからそれに渡すメソッドをクラスに定義することを好みます。


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

こんにちは!ええ、Serial.hなどのarduinoライブラリディレクトリを見回したところ、必要な定義が含まれていないHardwareSerial.hしか見つかりませんでした。最後に、シリアルオブジェクトを宣言しているように見える<WProgram.h>をインクルードする解決策を見つけました。
aaaidan、2011年

0

Serialヘッダーファイル/タブでクラス/オブジェクトを宣言する方法を見つけました:

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

これは私にはとてもきれいに感じませんが、まだ欠点はないようです。


1
そうですね、Arduino 1.0と互換性があることを確認したい場合は、ARDUINOコンパイルフラグに応じて、条件付きで「Arduino.h」を含める必要があります。詳細については、私の回答を参照してください。また、私の回答のチュートリアルリンクには、クラスにWProgram.hを常に含めるように記載されています
vicatcu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.