【问题标题】:Passing string to uint8_t array in arduino在arduino中将字符串传递给uint8_t数组
【发布时间】:2020-03-06 11:49:25
【问题描述】:

我必须从 Arduino 通过 XBee(在 API 模式下)发送一个整数计数器作为“num”。为此,我必须将此整数转换为字符串,然后转换为 uint8_t 数组,因为它需要在 API 帧中传输。

除了其他细节之外,我已将整数转换为字符串,例如

  String str;
  int num = 0;
  char  cstr[16];

void loop() {
  num++;
  str = String(num);
  str.toCharArray(cstr,16);

  Serial.println(cstr);  // this shows the correct result, means int is converted to String correctly

  uint8_t data[] = {cstr}; // passing String to uint8_t array

  XBeeAddress64 addr64 = XBeeAddress64();
  addr64.setMsb(0x00000000);
  addr64.setLsb(0x00000000); 
  ZBTxRequest zbTx = ZBTxRequest(addr64, data, sizeof(data));
  xbee.send(zbTx);

  int count = sizeof(data);
    for (int i = 0; i < count; i++) {
      if (i == (count-1)) {
      Serial.print(data[i]);   // here it prints "104" of ASCII which is equal to "h"       
      }
    } 
}

它也像串行打印一样传输它,即('104')。 如果我犯了任何错误,请指出,如果我没有按要求做,请指导我。

【问题讨论】:

    标签: arrays arduino xbee


    【解决方案1】:

    先把那些cstr和String去掉:

     int num = 0;
     //char  cstr[16];
      char data[16] = {'\0'}; // Initialize data array 
    
    void setup() {
    }    
    void loop() {
    
     num++;
     //str = String(num);
    //str.toCharArray(cstr,16);
     itoa (num, data, 10); 
    
      Serial.println(data); 
      // To get the number of elements in the array use
      uint8_t datalen = strlen(data);
      // Black box see lib for details
      XBeeAddress64 addr64 = XBeeAddress64();
      addr64.setMsb(0x00000000);
      addr64.setLsb(0x00000000); 
      ZBTxRequest zbTx = ZBTxRequest(addr64, data, datalen);
      xbee.send(zbTx);
     // Print test
      Serial.println("Content of data: ");
      Serial.print(data);
      Serial.print(" datalen: ");
      Serial.print(datalen);
    }
    

    这应该可以按您的预期工作。
    要复制一个数组,您可以使用 strcpy(或使用 malloc 和 free 的 memcopy),使用 strlen 获取元素数。

    编辑: 这是一个经过测试的代码(只需复制并粘贴并首先仅将包含替换为您的 xbee 库:

       #include "Xbee.h"    //-> Change to your xbee lib   
    
      uint16_t num = 0;
     char xdata[16] =  {'\0'};// Initialize data array
     char numbuf[16] =  {'\0'}; // initialize number buffer
     long currentMillis = 0;
    
     void setup() {
     Serial.begin(115200);
     currentMillis = millis();
    
    }
    void loop() {
    
     if (millis() - currentMillis > 1000) { // 1 sec timer to prevent overflow due to hammering xbee with data -> tune to your stable transmission
       num++;
       itoa (num, numbuf, 10);     // Num buffer 
       strcpy(xdata, numbuf);      // Copy content of num buffer to data array 
       Serial.println(xdata);
    
     // To get the number of elements in the array use
       uint16_t datalen = strlen(xdata); 
       // Black box see lib for details
         XBeeAddress64 addr64 = XBeeAddress64();
        addr64.setMsb(0x00000000);
        addr64.setLsb(0x00000000);
        ZBTxRequest zbTx = ZBTxRequest(addr64, data, datalen);
        xbee.send(zbTx);
       // Print test
       Serial.print("Content of xdata: ");
       Serial.print(xdata);
       Serial.print(" datalen: ");
       Serial.println(datalen);
       currentMillis = millis();   // reset timer
     }
    }
    

    串口监视器的结果是:

     1
     Content of xdata: 1 datalen: 1
     2
     Content of xdata: 2 datalen: 1
     3
     Content of xdata: 3 datalen: 1
     4
     Content of xdata: 4 datalen: 1
     ....
     864
     Content of xdata: 864 datalen: 3
     865
     Content of xdata: 865 datalen: 3
     866
     Content of xdata: 866 datalen: 3
    

    所以一切都按预期工作,没有 104 或类似的。请先复制粘贴 - 测试它 - 然后你的补充

    【讨论】:

    • 我仍然对此感到困惑,因为它对我不起作用,我只是想知道我如何将在每次循环执行中递增的计数器 int num = 0; 传递给 uint8_t 数组。
    • 如何通过在上面的代码中,究竟什么是“不工作”。老实说 - Xbee 库是黑匣子。打印 char 数组有效。 - 见编辑
    • 我要求的实际上是那个黑匣子。到目前为止,xbee mycode 和你的输出相同,即“104”,它与循环重复相同。
    • 我添加了一个完整的工作和测试示例 - 只需复制和粘贴,仅将包含更改为您的 xbee 库并运行然后学习 ;-) 如果此解决方案有效,标记为已解决安抚奶嘴可以学习
    • Codebreaker,上面讨论的问题已经解决,但现在我面临另一个问题,现在我想用我的数据发送一些字符作为节点标识符,我需要传递 num++; in我的数据数组,这里有什么可能?
    猜你喜欢
    • 2023-04-04
    • 2016-07-20
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多