arduino - 如何使 .print() 宏默认使用 F() (Arduino)
问题描述
我通常在开发过程中使用基本(硬件的 UART)串行通信进行调试。这意味着发送到 print() 的大部分文本不会在最终产品中发送(仅限于修复级别的消息)。由于我的调试消息包含大量选项卡和声明变量(及其描述)的大量信息,我发现我的 1K5 内衬项目在调试消息上花费的 RAM 是程序本身的几倍。
一个字母是一个字节 2000 个字母什么都不是。
我的大多数非调试串行通信(在开发过程中使用软件串行 Tx)和使用写入功能,使用字节本身而不发送实际文本。(目前矿井串行通信例程函数和结构使用6字节块,包括寻址)。
直截了当:我使用 Streaming.h 来加快文本添加到串行发送的速度。
每次都将文本字符串放入 F() 是很烦人
的(arduino 将它们作为全局变量加载)
有没有办法让 print() 使用 F() 函数而不编辑 Wire.h 库?(这会阻止我自动更新头文件)
解决方案
您应该使用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
推荐阅读
- python - 带有传递函数参数的方法调用
- protocol-buffers - 使用 protobuf-net 生成类时解码自定义选项值
- c++ - GTest 的 EXPECT_EQ 给出了未定义的错误引用
- sql - SQL - 在 WHERE 子句中使用计算日期
- .net-core - 当有未确认的未确认消息时,RabbitMQ 消费者变慢
- python - Keras 自定义回调以保存历史字典和回调顺序
- c# - c# Linux/Raspbian 中的 Mono App 在提供套接字时无法从串行端口读取(可以写入 / 但串行输入缓冲区报告 0 字节)
- java - 不同的 HashMap 大小 (Java)
- bootstrap-4 - Angular 6 + Bootstrap 4 添加带有@HostBinding 的“show”类
- admob - 颤振:firebase_admob 广告未显示