โทร Serial.print ในไฟล์แท็บ / ส่วนหัวแยกต่างหาก


9

ฉันกำลังเขียนโปรแกรมใน Arduino 0022

การโทรSerial.printlnทำงานได้ดีในรหัสร่างหลักของฉัน แต่เมื่อฉันพยายามใช้ในไฟล์ส่วนหัว " Menu.h" ซึ่งอยู่ในแท็บแยกต่างหากฉันได้รับข้อผิดพลาด:

ในไฟล์ที่รวมจาก AppController.cpp: 2:
Menu.h: ในตัวสร้าง 'เมนู :: เมนู ()':
เมนู: 15: ข้อผิดพลาด: 'อนุกรม' ไม่ได้ประกาศไว้ในขอบเขตนี้

ฉันจะใช้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" ราวกับว่าพวกเขาอยู่ในไฟล์ท้องถิ่น


ขอบคุณ Majenko คำตอบของคุณมีประโยชน์มากสำหรับฉันในฐานะผู้ฝึกหัด C ++ และฉันจะรับฟังคำแนะนำของคุณอย่างแน่นอน ถึงกระนั้นฉันก็สนใจมากขึ้นว่าทำไม Serial class ไม่สามารถใช้งานได้นอกร่างหลัก ไชโย!
aaaidan

3

ในฐานะที่เป็นทางเลือกในการ @ คำตอบที่ดีมาก Majenko ของคุณสามารถทำให้คลาส c ++ เพื่อแค็ปซูลฟังก์ชั่นของคุณและใส่ไว้ในห้องสมุดโฟลเดอร์ที่อธิบายไว้ในhttp://www.arduino.cc/en/Hacking/LibraryTutorial

คุณอาจต้อง#include <Serial.h>ใช้ไฟล์ในชั้นเรียนของคุณเพื่อให้สามารถเรียกใช้วิธีการแบบอนุกรมได้ ฉันจะระมัดระวังเกี่ยวกับการทำเจ้านี้เพราะมีผลข้างเคียงที่ชัดเจนในการเรียกฟังก์ชั่นอนุกรม (อ่านโดยเฉพาะ) ฉันชอบที่จะกำหนดวิธีการในชั้นเรียนของฉันที่ใช้ถ่าน * และส่งผ่านไบต์จากอินเทอร์เฟซแบบอนุกรมจากโปรแกรมหลักของฉันแทนที่จะให้มันโต้ตอบกับอินเตอร์เฟสแบบอนุกรมโดยตรง


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

Hi! ใช่ฉันได้ดูรอบ ๆ ในไดเรกทอรีไลบรารี 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.