【问题标题】:How to convert a string into an uint8_t array on Arduino?如何在 Arduino 上将字符串转换为 uint8_t 数组?
【发布时间】:2016-07-20 04:28:11
【问题描述】:

我有一个包含数字和字符值的字符串,例如“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的转换造成的

【问题讨论】:

  • see this
  • @WeatherVane 我试过了,但没用
  • 在什么情况下不起作用?
  • 我的意思是:(1) 你到底尝试了什么,(2) 你希望它做什么,以及 (3) 它做了什么与你希望的不同?
  • ...我已经相应地更新了我的答案。

标签: c string arduino xbee uint8t


【解决方案1】:

使用getBytes (https://www.arduino.cc/en/Reference/StringGetBytes) 将字符串中的字节复制到数组中。这需要byte[],除非https://www.arduino.cc/en/Reference/byte 积极误导,否则它应该与uint8_t[] 相同。

您需要数组已经存在并且足够大。您可以使用其length 方法找到字符串的长度。

(我认为getBytestoCharArray 更受欢迎,如果它绝对是你想要的uint8_t[]。)

代码中的一些 cmets

以上是在 Engo 发布一些代码之前编写的,并试图简单地回答这个问题。但是这里有一些关于代码的cmets。

  • String 上调用sizeof 几乎肯定不是您想要的。 String 对象可能包含其他内容(例如,长度信息),并且可能包含实际字节(例如,可能在指针后面)。有一个length 方法;用它。 (请记住,由于终止空字符,您的缓冲区需要大一个字节。)
  • 我不知道addr64 中的神奇数字是怎么回事(我对 xBee 一无所知),但我会假设你在那里做的事情是有道理的——但它看起来像是那种事情值得仔细检查。
  • 你说你“得到一个奇怪的输出”,但如果你告诉我们究竟是什么类型的奇怪输出,以及当你改变你试图改变的字符串时它如何(如果有的话)改变,它会更有用传输。
  • 您的代码引用了我认为的变量rx,但您没有向我们展示它是如何声明的。
  • ZBRxResponse 似乎有一个名为 getDataOffset 的方法。同样,我对这些东西一无所知,但你实际上试图从响应中提取的东西可能不是从偏移量 0 开始,而是从调用 getDataOffset 给出的偏移量开始?

【讨论】:

  • 你看到“@jB”那个位了吗?这些字符的十六进制ASCII码是40 6A 42。这些是你那个addr64的三个字节。所以让我再次指出我的最后一个要点。我猜想除了您发送的实际数据之外,ZBRxResponse 还包含各种其他内容,尤其包括(一些?)您提供的地址,以及您从 ZBRxResponse 的错误位中提取数据的内容。看看getDataOffset 返回什么。看看如果你从那里开始而不是从偏移量 0 开始会发生什么。
  • (您也应该修复sizeof 的问题,但在您编写的代码中,该错误的影响可能不那么引人注目。)
  • 非常感谢您的详细解释!我在我的代码中发现了多个错误。我改进的代码可以正常工作! :) 我会将我的问题更新为我的工作代码...
【解决方案2】:

看看HERE

uint8_t dataArray[dataString.length()];
dataString.toCharArray(dataArray, dataString.length())

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2019-08-11
    • 2017-03-27
    • 2020-07-08
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多