首页 > 解决方案 > 如何使 .print() 宏默认使用 F() (Arduino)

问题描述

我通常在开发过程中使用基本(硬件的 UART)串行通信进行调试。这意味着发送到 print() 的大部分文本不会在最终产品中发送(仅限于修复级别的消息)。由于我的调试消息包含大量选项卡和声明变量(及其描述)的大量信息,我发现我的 1K5 内衬项目在调试消息上花费的 RAM 是程序本身的几倍。
一个字母是一个字节 2000 个字母什么都不是。
我的大多数非调试串行通信(在开发过程中使用软件串行 Tx)和使用写入功能,使用字节本身而不发送实际文本。(目前矿井串行通信例程函数和结构使用6字节块,包括寻址)。

直截了当:我使用 Streaming.h 来加快文本添加到串行发送的速度。
每次都将文本字符串放入 F() 是很烦人
的(arduino 将它们作为全局变量加载)

有没有办法让 print() 使用 F() 函数而不编辑 Wire.h 库?(这会阻止我自动更新头文件)

标签: arduinoserial-port

解决方案


您应该使用F()将文本存储在闪存中,这是无法避免的。

您可以定义宏:

#define FPRINT(x) print(F(x))

Serial.FPRINT("text");

甚至像这样:

#define SFPRINT(x) Serial.print(F(x))

SFPRINT("test");

当然,你可以FPRINT用你想要的任何东西来替换,这不是预定义的(在这种情况下你会得到编译器警告)。

您还可以使用printf_P函数 from<stdio.h>PSTR宏 from <avr/pgmspace.h>(默认情况下它们应该包含在您在 Arduino IDE 中的程序中)。

存储在 RAM 中的文本的典型用途:

int a = 5;
printf("This is my variable: %d", a);

结果:

Sketch uses 1946 bytes (6%) of program storage space.
Global variables use 39 bytes (1%) of dynamic memory

与存储在 FLASH 中的文本一起使用:

int a = 5;
printf_P(PSTR ("This is my variable: %d"), a);

结果:

Sketch uses 1958 bytes (6%) of program storage space.
Global variables use 15 bytes (0%) of dynamic memory

推荐阅读