Tôi có thể làm cho Arduino bỏ qua in nối tiếp


8

Tôi thích có giao tiếp nối tiếp cho mục đích gỡ lỗi và thử nghiệm nhưng sau một thời gian nó sẽ lấy đi quá nhiều tốc độ từ bản phác thảo.

Có thể để Arduino bỏ qua serial.print và serial.println trong toàn bộ mã của tôi, mà không biến nó thành một nhận xét hoặc đặt mọi in ấn nối tiếp bên trong ví dụ như câu lệnh "if (debug == true)" không?

Cảm ơn trước.

Câu trả lời:


14

Nếu bạn nhấn mạnh vào hiệu suất hàng đầu, điều tốt nhất sẽ là sử dụng macro cho điều đó:

#define Sprintln(a) (Serial.println(a))

Sau đó thay vì

Serial.println(F("Hello world!"));

viết

Sprintln(F("Hello world!"));

v.v ... Để hủy kích hoạt Serialin, xác định macro trống:

#define Sprintln(a) 

Điều này sẽ có bộ xử lý trước loại bỏ tất cả mã gỡ lỗi được xác định Sprintlntừ mã của bạn.

(Tất nhiên, có một số lượng lớn các biến thể về chủ đề này.)


Bạn cũng có thể gói tất cả các bản in đang tồn tại #ifdef ENABLE_PRINT#endifsau đó xác định hoặc nhận xét #define ENABLE_PRINTở đầu tệp ur
portforwardpodcast

Bạn thậm chí có thể đặt mức gỡ lỗi và xác định macro cho debugL1();, debugL2();v.v., vì vậy bạn có thể chọn số lượng chi tiết bạn muốn "ghi nhật ký". Mặc dù vậy, macro sẽ làm cho nó không thể thay đổi thời gian chạy, nhưng với lợi thế là không có phí thời gian chạy.
Paul

7

Bạn có thể, ví dụ, sử dụng bộ tiền xử lý để thay đổi tất cả Serialtrong mã của bạn.

#ifndef ENABLE_PRINT
// disable Serial output
#define Serial SomeOtherwiseUnusedName
static class {
public:
    void begin(...) {}
    void print(...) {}
    void println(...) {}
} Serial;
#endif

1

Một giải pháp khác là triển khai một thiết bị nối tiếp giả. Đó sẽ là một lớp mà Phần cứng được kế thừa từ Luồng và thực hiện các hàm thành viên ảo cần thiết với các hàm giả.

class NullSerial : public Stream {
public:
  virtual size_t write(uint8_t) { return (1); }
  virtual int available() { return (0); }
  virtual int read() { return (0); }
  virtual int peek() { return (0); }
  virtual void flush() {}
  ...
  void begin(unsigned long, uint8_t) {}
  void end() {}
  ...
};

NullSerial Serial;

Vì serial không được định nghĩa là ký hiệu yếu, ứng dụng sẽ cần sử dụng biến Steam cho đầu ra. Và liên kết điều này với Phần cứng hoặc NullSerial.

#if defined(DEBUG)
Stream& trace = Serial;
#else
NullSerial noSerial;
Stream& trace = noSerial;
#else

#endif
...
trace.print(42);

Điều này không đầy đủ vì tất cả các chức năng thành viên của Phần cứng (mà bản phác thảo sử dụng) là cần thiết nhưng đưa ra ý tưởng chung về cách sử dụng OOP để giải quyết vấn đề.

Chúc mừng!

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.