별도의 탭 / 헤더 파일에서 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에서 여러 파일을 사용하려면 공유하려는 다른 파일에있는 기능을 설명하기 위해 하나 이상의 헤더 파일이 필요합니다. 또한 모든 파일에서 사용하려는 모든 전역 변수.

이러한 정의는 "외부"속성으로 규정되어야합니다.

그런 다음 함수에 대한 실제 코드 및 변수 정의가 포함 된 하나 이상의 "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

3

@Majenko의 좋은 대답에 대한 대안으로 C ++ 클래스를 작성하여 함수를 캡슐화하고 http://www.arduino.cc/en/Hacking/LibraryTutorial에 설명 된대로 라이브러리 폴더에 넣을 수 있습니다.

당신은해야 할 수도 #include <Serial.h>직렬 메소드를 호출 할 수있는 클래스의 구현 파일에. 직렬 함수 호출 (특히 읽기)에 부작용이 있기 때문에이 thoug를 수행하는 데주의해야합니다. char 클래스를 사용하여 직렬 인터페이스와 직접 상호 작용하지 않고 직렬 인터페이스의 바이트를 기본 프로그램에서 전달하는 메소드를 클래스에 정의하는 것을 선호합니다.


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

안녕! 예, Serial.h 또는 그와 비슷한 arduino 라이브러리 디렉토리를 살펴 보았고 찾을 수있는 것은 HardwareSerial.h였습니다.이 정의에는 필요한 정의가 포함되어 있지 않습니다. 결국 나는 직렬 객체를 선언하는 것처럼 보이는 <WProgram.h>를 포함하는 해결책을 발견했습니다.
aaaidan

0

Serial헤더 파일 / 탭에 클래스 / 객체를 선언 하는 방법을 찾았습니다 .

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

이것은 나에게 매우 깨끗하다고 ​​느끼지 않지만 아직 단점이없는 것 같습니다.


1
아, Arduino 1.0과 호환되는지 확인하려면 ARDUINO 컴파일 플래그에 따라 조건부 또는 "Arduino.h"를 포함시켜야합니다. 자세한 내용은 내 대답을 참조하십시오. 또한, 내 답변의 튜토리얼 링크는 항상 수업에
WProgram.h를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.