新的 SafeString Arduino 库(可从库管理器中获得)使这一过程变得简单而安全。与 Arduino Strings 不同,SafeStrings 不会导致您的草图重新启动,也不会导致堆碎片化。
详细教程见https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html
SafeStrings 易于调试。SafeStrings 提供详细的错误消息,包括相关 SafeString 的名称,以帮助您正确运行程序。
SafeStrings 安全可靠。 SafeStrings 永远不会导致重新启动,并且始终处于有效的可用状态,即使您的代码传递空指针或“\0”参数或超出 SafeString 的可用容量也是如此.
SafeString 程序永远运行。 SafeStrings 完全避免内存碎片,这最终会导致您的程序失败,并且在作为参数传递时不会产生额外的副本。
SafeString 更快。 SafeString 不会创建多个副本或短期对象,也不会对数据进行不必要的复制。
SafeString 还具有标记/解析方法。其中一个可能详细的示例包括库中的内容,包括读取用户输入和解析命令,同时保持草图的其余部分以最大速度运行。 SafeString 方法中没有邪恶的延迟()来阻止你的草图在它的跟踪中。
注意:在下面的示例代码中,SafeStrings 的大小很小,但代码可以处理来自用户的任意长输入。
用户串行输入,例如
这是一个长输入,打开和关闭等
处理和解析都很好。
SafeString 还具有大量调试和错误消息,可帮助您查找和修复编码问题。
#include "SafeString.h"
const size_t maxCmdLength = 3; // make SafeStrings at least large enough to hold longest cmd
// Use SafeStrings for the commands as comparing two SafeStrings is generally faster as the lengths can be compared first.
createSafeString(onCmdStr, maxCmdLength, "on");
createSafeString(offCmdStr, maxCmdLength, "off");
// input must be large enough to hold longest cmd + 1 delimiter
createSafeString(input, maxCmdLength + 1); // to read input cmd + 1 delimiter
createSafeString(token, maxCmdLength + 1); // for parsing capacity >= input.capacity()
char delimiters[] = " .,\r\n"; // space dot comma CR NL are cmd delimiters
void setup() {
Serial.begin(9600); // Open serial communications and wait a few seconds
SafeString::setOutput(Serial); // enable error messages and debug() output to be sent to Serial
}
void loop() {
input.read(Serial); // read from Serial, returns true if at least one character was added to SafeString input
if (input.nextToken(token, delimiters)) { // process at most one token per loop does not return tokens longer than input.capacity()
if (token == onCmdStr) {
Serial.println("switching on");
digitalWrite(ledPin, HIGH)
} else if (token == offCmdStr) {
Serial.println("switching off");
digitalWrite(ledPin, LOW);
}// else // not a valid cmd ignore
}
}