arduino简单string入门——SafeString 替代方案

如上所述,Arduino 字符串是一种非常实用且安全的文本处理编程方法。然而,SafeString 库比使用字符串具有许多优势。

完全控制内存使用

SafeStrings 是 char[] 的包装器,可防止缓冲区溢出和超出范围索引。由于 SafeString 使用固定的 char[],因此创建 SafeString 时内存使用量是固定的,不会发生变化。创建全局 SafeStrings 时,编译器会报告其内存使用量,因此可以更轻松地查看代码使用了多少 SRAM。SafeStrings 还占用更少的内存,因为它们不需要在 compare 和 indexOf 函数中使用“文本”之前将其转换为 SafeString。

捕获、标记和忽略错误并打印详细信息以帮助您修复错误

SafeString 检查其每个函数调用是否存在空指针、缓冲区溢出和超出范围索引。 会导致错误的函数调用将被忽略,即 SafeString 保持不变,错误会被标记并显示详细的错误消息,让您可以找出问题并进行修复。 SafeString 也没有 Arduino String 代码中的错误

简单的非阻塞串行读取器

Arduino 字符串读取器 Serial.readStringUntil() 可以在等待数据时阻止循环等待。虽然您可以使用字符串编写非阻塞读取器,但 SafeString 中的方法更简单,并且具有许多高级功能,例如标记输入、非阻塞输入超时、可选择的输入回显以及 skipToDelimiter 函数以跳过不需要的或部分输入。SafeString 读取器还会计算读取的字符数,以便您可以检查何时收到整个 Web 响应。

更好的数字解析方法

如上所述,String toInt() 方法可能会产生奇怪的结果。如果字符串是有效数字,则 SafeString toInt(int i)、toLong(long l) 等返回 true 并更新参数,否则返回 false。如果字符串不是数字,则 String toInt() 方法只返回 0,对于“5.9”和“5a”则返回 5

更易于与库一起使用

第三方库通常将其文本结果作为 char* 返回。如果您使用字符串,则在将结果分配给字符串时,您将使用额外的内存对文本进行完整复制。另一方面,使用 SafeString,您只需将 char* 包装在 SafeString 中而无需复制,然后安全地解析和处理数据。

更多文本处理功能

字符串具有 startsWith、endsWith、indexOf、lastIndexOf、substring、replace 和 remove 方法,而 SafeString 则不仅拥有这些方法,还拥有一整套 print() 方法(用于打印到 SafeString 中),以及 prefix()、startsWithIgnoreCase()、indexOfCharFrom()、removeBefore()、removeFrom()、removeLast()、stoken()、nextToken() 和非阻塞 readFrom()、writeTo()、read()、readUntil()、readUntilToken()

SafeString 库还有一个 SafeStringStream 类,可让您自动测试需要处理流数据输入的草图。

另外还有 BufferedInput 和 BufferedOutput 类,它们提供更大的输入缓冲区和非阻塞串行输出。SafeString 库中还包括非阻塞 millisDelay 计时器类和 loopTimer 类。

结论

Arduino 字符串并不像人们想象的那么糟糕,只要遵循一些指导原则,就可以放心地在草图中使用。Arduino 字符串比普通的 char[] 占用最少的额外 SRAM 内存,大约 8 个字节/字符串,但这 8 个字节为您提供了完全的安全性,避免了缓冲区溢出和缺少字符串终止符,以及方便的编码方法。

如果您想完全控制内存使用情况,或者您正在使用返回 char* 的库,或者您想要一组更丰富的读取器、解析器和文本函数,或者想要详细的调试/错误消息,那么您可以 从 Arduino 库管理器安装SafeString 库。

String 或 SafeString 这两种替代方案都比使用容易出错的低级 char[] 操作和 c 字符串方法(如 strcat 和 strcpy)要好,后者是导致 许多编程错误的系统性原因

 

posted @ 2025-01-27 00:30  mcwhirr  阅读(45)  评论(0)    收藏  举报