Gọi serial.print trong một tệp tiêu đề / tab riêng biệt


9

Tôi đang viết một chương trình trong Arduino 0022.

Gọi Serial.printlnhoạt động tốt trong mã phác thảo chính của tôi, nhưng khi tôi cố gắng sử dụng nó trong tệp tiêu đề của mình " Menu.h", trong một tab riêng biệt, tôi gặp lỗi:

Trong tệp được bao gồm từ AppControll.cpp: 2:
Menu.h: Trong hàm tạo 'Menu :: Menu ()':
Menu.h: 15: error: 'serial' không được khai báo trong phạm vi này

Làm thế nào tôi có thể sử dụng Serial.printlnbên ngoài mã phác thảo?

Câu trả lời:


3

Bạn không nên gọi các chức năng từ trong tệp tiêu đề. Các tệp tiêu đề là để xác định các macro tiền xử lý (#define) và tham chiếu đến các biến / hàm trong các tệp khác.

Bạn nên tạo nhiều tệp C và liên kết chúng với nhau tại thời điểm biên dịch. Tệp tiêu đề được sử dụng để báo cho mỗi tệp C những chức năng và biến số mà các tệp C khác có.

Để sử dụng nhiều tệp trong Arduino IDE, bạn cần ít nhất 1 tệp tiêu đề để mô tả các chức năng có trong các tệp khác mà bạn muốn chia sẻ giữa chúng. Ngoài ra, bất kỳ biến toàn cục nào bạn muốn sử dụng trên tất cả các tệp.

Các định nghĩa này phải đủ điều kiện với thuộc tính "bên ngoài".

Sau đó, bạn cần thêm một hoặc nhiều tệp "pde" chứa mã thực tế và định nghĩa biến cho các hàm.

Chẳng hạn, tôi có tệp "mouse.h":

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

và tệp "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);
}

Sau đó, trong tập tin chính của tôi, tôi có:

#include "mouse.h"

và tôi có thể gọi các hàm trong "mouse.pde" như thể chúng nằm trong tệp cục bộ.


Cảm ơn Majenko, câu trả lời của bạn rất hữu ích với tôi với tư cách là một lập trình viên C ++ mới làm quen, và tôi chắc chắn sẽ chấp nhận lời khuyên của bạn. Mặc dù vậy, tôi đã quan tâm nhiều hơn đến lý do tại sao lớp Nối tiếp không có sẵn ngoài bản phác thảo chính. Chúc mừng!
aaaidan

3

Thay thế cho câu trả lời rất hay của @ Majenko, bạn có thể tạo một lớp C ++ để đóng gói các chức năng của mình và đưa nó vào thư mục thư viện như được mô tả trong http://www.arduino.cc/en/Hacking/L LibraryTutorial .

Bạn có thể cần #include <Serial.h>trong tệp triển khai của lớp để có thể gọi các phương thức Nối tiếp. Tôi sẽ cẩn thận khi thực hiện công việc khó khăn này vì rõ ràng có tác dụng phụ khi gọi các chức năng Nối tiếp (đặc biệt là đọc). Tôi thích định nghĩa một phương thức trong lớp lấy char * và truyền byte từ giao diện nối tiếp vào nó từ chương trình chính của tôi, thay vì để nó tương tác trực tiếp với giao diện nối tiếp.


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

Chào! Vâng, tôi đã có một cái nhìn xung quanh trong thư mục thư viện arduino cho Serial.h hoặc tương tự, và tất cả những gì tôi có thể tìm thấy là Phần cứngSerial.h, không chứa các định nghĩa tôi cần. Cuối cùng, tôi tình cờ tìm thấy giải pháp bao gồm <WProgram.h>, dường như khai báo đối tượng Nối tiếp.
aaaidan

0

Tôi đã tìm thấy một cách để Seriallớp / đối tượng được khai báo trong các tệp / tab tiêu đề:

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

Điều này không cảm thấy siêu sạch đối với tôi, nhưng dường như nó không có bất kỳ nhược điểm nào.


1
À đúng rồi, nếu bạn muốn chắc chắn rằng bạn tương thích với Arduino 1.0, bạn nên bao gồm điều đó hoặc "Arduino.h" tùy thuộc vào cờ biên dịch ARDUINO xem chi tiết câu trả lời của tôi. Ngoài ra, liên kết hướng dẫn trong câu trả lời của tôi nói rằng luôn luôn bao gồm WProgram.h trong các lớp học của bạn
Abbeyatcu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.