如何在Arduino上将字符串转换为uint8_t数组?

3
我有一个包含数字和字符的字符串,例如 "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导致的。


请查看此链接:https://www.arduino.cc/en/Reference/StringToCharArray。 - Weather Vane
@WeatherVane 我尝试过了,但没有成功。 - Engo
我的意思是:(1)你具体尝试了什么,(2)你希望它能做什么,(3)它做了什么与你的期望不同? - Gareth McCaughan
@Engo请发布您尝试过的内容以及出现了什么问题。唉。 - Weather Vane
1
...我已经相应地更新了我的答案。 - Gareth McCaughan
显示剩余3条评论
2个回答

4
请看这里,涉及IT技术相关内容。
uint8_t dataArray[dataString.length()];
dataString.toCharArray(dataArray, dataString.length())

4
使用 getBytes (https://www.arduino.cc/en/Reference/StringGetBytes) 将字符串中的字节复制到数组中。它需要一个 byte[],除非 https://www.arduino.cc/en/Reference/byte 是误导性的,否则应该与 uint8_t[] 相同。
您需要先创建并足够大的数组。您可以使用字符串的 length 方法找到字符串的长度。
(如果您确实需要一个 uint8_t[],我认为 getBytestoCharArray 更好。)
关于您的代码,以下是一些评论。
在 Engo 发布代码之前,上面的内容旨在回答问题。但是这里有一些对代码的评论。
- 在 String 上调用 sizeof 函数几乎肯定不是您想要的。 String 对象可能包括其他内容(例如长度信息),并且可能不包括实际的字节(例如可能在指针后面)。有一个 length 方法,请使用它。(记住您的缓冲区需要更大一个字节,因为有终止空字符。) - 我不知道 addr64 中的魔术数字是什么(我不知道 xBee 的任何信息),但我会假设您在那里做的事情是有意义的 - 但这看起来像是值得仔细检查的东西。 - 您说您“得到了奇怪的输出”,但如果您告诉我们确切的奇怪输出类型,以及当您更改要传输的字符串时它如何(如果有)更改,那将更有用。 - 您的代码引用了一个名为 rx 的变量,但您没有向我们展示它是如何声明的。 - ZBRxResponse 看起来有一个名为 getDataOffset 的方法。再次说明,我对这些东西一无所知,但您实际上尝试从响应中获取的内容是否不是从偏移量 0 开始,而是从调用 getDataOffset 给出的偏移量开始?

1
你看到那个写着 "@jB" 的比特了吗?这些字符的 ASCII 码,用十六进制表示,为 40 6A 42。这是你的 addr64 的三个字节。所以让我再指向我的最后一个要点。我猜测 ZBRxResponse 包含了除了你发送的实际数据之外的其他各种东西,包括特别是(你提供的部分)地址,并且你正在从 ZBRxResponse 的错误位拉取数据。请查看 getDataOffset 返回了什么。看看如果你从偏移量而不是从偏移量 0 开始会发生什么。 - Gareth McCaughan
1
你应该修复 sizeof 的问题,但是按照你的代码编写方式,该错误的影响可能不会那么显著。 - Gareth McCaughan
非常感谢您详细的解释!我在我的代码中发现了多处错误。我的改进后的代码可以正常工作! :) 我将更新我的问题以展示我的工作代码... - Engo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接