如何在 Arduino 上将字符串转换为 uint8_t 数组?
How to convert a string into an uint8_t array on Arduino?
我有一个包含数字和字符值的字符串,例如 "p1200"。我需要将这个字符串转换成一个 uint8_t 数组,因为我需要从我的 xBee 发送它。
如何转换
String dataString = "p1200"
进入
uint8_t dataArray[]
?
我尝试使用以下代码发送此字符串:
power = ((360 * pulseCount) / 60);
String dataString = "p" + power;
char dataArray[sizeof(dataString)];
dataString.toCharArray(dataArray, sizeof(dataString));
XBeeAddress64 addr64 = XBeeAddress64();
addr64.setMsb(0x13A200);
addr64.setLsb(0x406A42B7);
ZBTxRequest zbTx = ZBTxRequest(addr64, (uint8_t *)dataArray, sizeof(dataArray));
xbee.send(zbTx);
并使用以下代码接收字符串:
String incomingData;
xbee.readPacket();
if (xbee.getResponse().isAvailable()) {
Serial.println(xbee.getResponse().getApiId());
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
xbee.getResponse().getZBRxResponse(rx);
for (int i = 0; i < rx.getDataLength(); i++) {
incomingData += (char)rx.getData(i);
}
}
}
当我打印 incomingData
时,我得到了一个奇怪的输出...
我以为是字符串转换成uint8_t
引起的
看看HERE
uint8_t dataArray[dataString.length()];
dataString.toCharArray(dataArray, dataString.length())
使用 getBytes
(https://www.arduino.cc/en/Reference/StringGetBytes) to copy the bytes from your string into an array. That expects a byte[]
, and unless https://www.arduino.cc/en/Reference/byte 具有误导性,应该与 uint8_t[]
相同。
您需要数组已经存在并且足够大。您可以使用 length
方法找到字符串的长度。
(我认为 getBytes
优于 toCharArray
如果它确实是你想要的 uint8_t[]
。)
对您的代码的一些评论
以上是在 Engo 发布一些代码之前写的,并试图简单地回答问题。但是这里有一些关于代码的评论。
- 在
String
上调用 sizeof
几乎肯定不是您想要的。 String
对象可能包括其他内容(例如,长度信息)并且可能 不 包括实际字节(例如可能在指针后面)。有一个 length
方法;用它。 (请记住,由于终止空字符,您的缓冲区需要大一个字节。)
- 我不知道
addr64
中的神奇数字是怎么回事(我对 xBee 一无所知)但我会假设你在那里做的事情是有道理的——但它看起来像那种值得仔细检查的东西。
- 你说你 "get a strange output",但如果你确切地告诉我们奇怪的输出类型,以及当你更改你正在尝试的字符串时它如何(如果有的话)如何改变,这将更有用传送。
- 您的代码引用了我认为是变量的内容,称为
rx
,但您没有向我们展示它是如何声明的。
ZBRxResponse
似乎有一个名为 getDataOffset
的方法。同样,我对这些东西一无所知,但是你实际上试图从响应中提取的东西可能不是从偏移量 0 开始,而是从调用 getDataOffset
?[=47= 给出的偏移量开始]
我有一个包含数字和字符值的字符串,例如 "p1200"。我需要将这个字符串转换成一个 uint8_t 数组,因为我需要从我的 xBee 发送它。
如何转换
String dataString = "p1200"
进入
uint8_t dataArray[]
?
我尝试使用以下代码发送此字符串:
power = ((360 * pulseCount) / 60);
String dataString = "p" + power;
char dataArray[sizeof(dataString)];
dataString.toCharArray(dataArray, sizeof(dataString));
XBeeAddress64 addr64 = XBeeAddress64();
addr64.setMsb(0x13A200);
addr64.setLsb(0x406A42B7);
ZBTxRequest zbTx = ZBTxRequest(addr64, (uint8_t *)dataArray, sizeof(dataArray));
xbee.send(zbTx);
并使用以下代码接收字符串:
String incomingData;
xbee.readPacket();
if (xbee.getResponse().isAvailable()) {
Serial.println(xbee.getResponse().getApiId());
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
xbee.getResponse().getZBRxResponse(rx);
for (int i = 0; i < rx.getDataLength(); i++) {
incomingData += (char)rx.getData(i);
}
}
}
当我打印 incomingData
时,我得到了一个奇怪的输出...
我以为是字符串转换成uint8_t
看看HERE
uint8_t dataArray[dataString.length()];
dataString.toCharArray(dataArray, dataString.length())
使用 getBytes
(https://www.arduino.cc/en/Reference/StringGetBytes) to copy the bytes from your string into an array. That expects a byte[]
, and unless https://www.arduino.cc/en/Reference/byte 具有误导性,应该与 uint8_t[]
相同。
您需要数组已经存在并且足够大。您可以使用 length
方法找到字符串的长度。
(我认为 getBytes
优于 toCharArray
如果它确实是你想要的 uint8_t[]
。)
对您的代码的一些评论
以上是在 Engo 发布一些代码之前写的,并试图简单地回答问题。但是这里有一些关于代码的评论。
- 在
String
上调用sizeof
几乎肯定不是您想要的。String
对象可能包括其他内容(例如,长度信息)并且可能 不 包括实际字节(例如可能在指针后面)。有一个length
方法;用它。 (请记住,由于终止空字符,您的缓冲区需要大一个字节。) - 我不知道
addr64
中的神奇数字是怎么回事(我对 xBee 一无所知)但我会假设你在那里做的事情是有道理的——但它看起来像那种值得仔细检查的东西。 - 你说你 "get a strange output",但如果你确切地告诉我们奇怪的输出类型,以及当你更改你正在尝试的字符串时它如何(如果有的话)如何改变,这将更有用传送。
- 您的代码引用了我认为是变量的内容,称为
rx
,但您没有向我们展示它是如何声明的。 ZBRxResponse
似乎有一个名为getDataOffset
的方法。同样,我对这些东西一无所知,但是你实际上试图从响应中提取的东西可能不是从偏移量 0 开始,而是从调用getDataOffset
?[=47= 给出的偏移量开始]