【问题标题】:Arduino int to String conversionArduino int 到字符串的转换
【发布时间】:2015-05-21 03:35:28
【问题描述】:

我有这个代码:

String c = String(BTLEserial.read());
char relevant = c.charAt(0);
Serial.println(relevant);

其中BTLEserial.read() 返回类型Int。我将其转换为第一行中的String,以便我可以在下一行使用charAt 函数。

当我发送我的蓝牙“0000”时,我的println(relevant) 打印4

我做了一个测试println()语句来打印c的值,发现当BTLEserial.read()为0000时它的值竟然是48。这告诉我,当我将IntBTLEserial.read() 更改为字符串c 时,我遇到了转换问题。

这里发生了什么,将BTLEserial.read() 转换为类型String 的正确方法是什么?

【问题讨论】:

  • 为什么您确信您看到的“疯狂整数值”不是从蓝牙读取的第一个字符?请提供更多详细信息和示例输出...
  • 发送到我的蓝牙的字符串的第一个字符是 0,Serial.println() 行打印的字符是 8。
  • 从一个数字构造一个字符串会产生一个包含该数字的 ASCII 表示的字符串。 正如文档所说,所以你的构造是正确的。
  • 您将charAt(1) 更改(编辑3)为charAt(0) 并且仍然看到相同的输出,这非常令人困惑。请问String.charAt函数现在是如何工作的?

标签: c++ string arduino int


【解决方案1】:

我做了一个测试println()语句打印c的值,发现当BTLEserial.read()为0000时它的值为48

不足为奇。 “0”的ASCII值是48。

Adafruit_BLE_UART::read() 返回的“int”是最近收到的字节;如果你想接收多个字节,例如字符串“0000”,那么您需要多次调用它,每次都将字符添加到缓冲区中。

【讨论】:

  • 就是这样!深入了解 read() 函数,以及在我的字符串转换中发生的隐式 ASCII 转换。
【解决方案2】:

难道String 对象的第一个字符位于索引 0 处?所以实际上,您正在读取字符串后面的一个字符(它不包含空字符,如the docs)。

一个方便的 String 实现应该抛出一个异常,或者至少警告你你正在阅读越界。但在 Arduino 上,您需要自己验证边界检查(嘿,它是嵌入式的)。

【讨论】:

  • 很好,但无论哪种方式,它都不应该返回 8,因为字符串中的任何地方都不存在 8。
  • 响应您的编辑,如果我错了,请纠正我,但 charAt(1) 并没有越界,因为索引 1 只是第二个字符。不是第一个,如我所愿,但也没有越界。
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2018-10-01
  • 2012-05-04
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多