Arduino int 到字符串的转换
Posted
技术标签:
【中文标题】Arduino int 到字符串的转换【英文标题】:Arduino int to String conversion 【发布时间】: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
。这告诉我,当我将Int
值BTLEserial.read()
更改为字符串c
时,我遇到了转换问题。
这里发生了什么,将BTLEserial.read()
转换为类型String
的正确方法是什么?
【问题讨论】:
为什么您确信您看到的“疯狂整数值”不是从蓝牙读取的第一个字符?请提供更多详细信息和示例输出... 发送到我的蓝牙的字符串的第一个字符是 0,Serial.println() 行打印的字符是 8。 从一个数字构造一个字符串会产生一个包含该数字的 ASCII 表示的字符串。 正如文档所说,所以你的构造是正确的。 您将charAt(1)
更改(编辑3)为charAt(0)
并且仍然看到相同的输出,这非常令人困惑。请问String.charAt
函数现在是如何工作的?
【参考方案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 只是第二个字符。不是第一个,如我所愿,但也没有越界。以上是关于Arduino int 到字符串的转换的主要内容,如果未能解决你的问题,请参考以下文章