Arduino:字符串连接?

Posted

技术标签:

【中文标题】Arduino:字符串连接?【英文标题】:Arduino: String join? 【发布时间】:2011-04-25 18:16:33 【问题描述】:

我正在尝试为 Arduino 编写 join 方法:

#define ARG_DELIMITER ','

  String join(const String strs[], const int len) 
    String result = "";
    for (int i = 0; i < len; i++) 
      result += strs[i] + ARG_DELIMITER;
      Serial.println(result);
    
    return result.substring(0, result.length() - 1);
  

loop()中的调用代码:

const String args[3] = "foo", "bar", "baz";
Serial.println(SlaveTalk.join(args, 3));

这将打印以下内容:

foo
foo
foo
fo

只要程序运行,后跟空字符串。

我在这里做错了什么?

【问题讨论】:

可能更重要的是,String 类/类型是什么? @Michael - String 类似乎已定义为 here。 从 C++ 角度接近此问题的人可能会感兴趣的另一个细节:“Arduino 语言基于 C/C++”(来自 arduino.cc/en/Reference/HomePage)。所以它类似于但不完全是 C++。 【参考方案1】:

这一行

const String args[3] = "foo", "bar", "baz";

给你字符串

"foo\0" "bar\0" "baz\0"

其中 \0 是 NULL 字符。所以当你连接时,我希望你最终得到:

"foo\0bar\0baz\0"

打印在 null 处停止,这就是您看到 foo 3 次的原因。在 return 语句中,长度为 3 "foo",减去 1 得到 "fo"

【讨论】:

我不认为这是正确的。 Arduino String 类使用strcat 表示+=,如下所示:j.mp/dXCCrg。 strcat 覆盖第一个缓冲区的空终止符,并在末尾附加一个新的空终止符:cplusplus.com/reference/clibrary/cstring/strcat。【参考方案2】:

以下代码使用 Arduino 软件版本 0022 和带有 ATmega 328 的 Arduino Duemilanove 按预期工作:

#define ARG_DELIMITER ','

class SlaveTalkClass

  public:
    String join(const String strs[], const int len) 
      String result = "";
      for (int i = 0; i < len; i++) 
        result += strs[i] + ARG_DELIMITER;
        Serial.println(result);
      
      return result.substring(0, result.length() - 1);
    
 SlaveTalk;

void setup()

  Serial.begin(9600);


void loop()

  const String args[3] = "foo", "bar", "baz";
  Serial.println(SlaveTalk.join(args, 3));

它反复向串行监视器打印以下内容:

foo,
foo,bar,
foo,bar,baz,
foo,bar,baz

【讨论】:

【参考方案3】:

PString 是一个优秀的库,可以连接。它有一些简洁的功能,最重要的是,它是运行时安全的。

【讨论】:

展示你如何在实际任务中使用 PString,添加一些示例代码!

以上是关于Arduino:字符串连接?的主要内容,如果未能解决你的问题,请参考以下文章

unity在安卓手机上使用蓝牙连接arduino蓝牙模块

在两个 arduino 微控制器上使用 i2c 通信发送字符串

arduino 中如何将字符串型转换为float型?

求助关于arduino串口字符串提取浮点数

Arduino uno板上连接一个HC-05,设置后能与手机配对成功,但是无法连接?

没有与连接的串行端口通信?