【问题标题】:Converting from int to byte array then back to int using atoi and itoa on Arduino for transmission在 Arduino 上使用 atoi 和 itoa 从 int 转换为字节数组,然后返回 int 进行传输
【发布时间】:2013-04-02 12:34:04
【问题描述】:

我正在转换一个带符号的 int 以通过 Arduino Wire 作为多个字节发送,所以我做了以下操作:

下面的代码是我实现的调试,你可以复制到Arduino IDE中查看打印输出。

我无法理解的是 itoa 如何创建一个大于声明大小的数组,而 sizeof() 无法检测到该数组。我声明的数组大小为 2 但 itoa 使用大小为 6 的数组来存储其结果!!

Serial.println("|----START DEBUG------|");
int Sensor1Data=-32760;
Serial.print("Sensor1Data: ");Serial.println(Sensor1Data);
byte Sensor1CharMsg[2];

Serial.println("|----STAGE 2------|");
Serial.print("Array Size b4 itoa: ");Serial.println(sizeof(Sensor1CharMsg));
itoa(Sensor1Data,(char*)Sensor1CharMsg,10);
Serial.print("Array Values up to 10 elements: ");Serial.write(Sensor1CharMsg,10); Serial.println("");
Serial.print("Array Size a4tr itoa: ");Serial.println(sizeof(Sensor1CharMsg));

Serial.println("||||||| ARRAY OUTPUT|||||||");
Serial.print("Sensor1CharMsg[0]): ");  Serial.println(Sensor1CharMsg[0]);
Serial.print("Sensor1CharMsg[1]): ");  Serial.println(Sensor1CharMsg[1]);
Serial.print("Sensor1CharMsg[2]): ");  Serial.println(Sensor1CharMsg[2]);
Serial.print("Sensor1CharMsg[3]): ");  Serial.println(Sensor1CharMsg[3]);
Serial.print("Sensor1CharMsg[4]): ");  Serial.println(Sensor1CharMsg[4]);
Serial.print("Sensor1CharMsg[5]): ");  Serial.println(Sensor1CharMsg[5]);
Serial.println("|||||||END ARRAY OUTPUT|||||||");

传输后:

int Sensor2Data = atoi((char*)Sensor1CharMsg);
Serial.print("Sensor2Data: ");Serial.println(Sensor2Data);

结果

|----START DEBUG------|
Sensor1Data: -32760
|----STAGE 2------|
Array Size b4 itoa: 2
-32760
Array Size a4tr itoa: 2
||||||| ARRAY OUTPUT|||||||
Sensor1CharMsg[0]): 45
Sensor1CharMsg[1]): 51
Sensor1CharMsg[2]): 50
Sensor1CharMsg[3]): 55
Sensor1CharMsg[4]): 54
Sensor1CharMsg[5]): 48
|||||||END ARRAY OUTPUT|||||||

传输后

Sensor2Data: -32760

【问题讨论】:

    标签: c++ c arduino itoa


    【解决方案1】:

    您正在覆盖内存,调用未定义的行为。

    另外,itoa() 并不完全创建一个“字节数组”,它创建一个字符串。该名称的意思是“整数到 ASCII”。 The documentation 说:

    调用者负责提供足够的存储空间 [...]

    最后,字符串的长度由strlen() 计算,而不是sizeof

    【讨论】:

    • sizeof 在数组上工作得很好(但不是函数数组参数,它们实际上是伪装的指针)
    • 但是对于你想使用strlen的字符串。因为strlen 始终有效(对于以零结尾的字符串)而sizeof 仅在极少数情况下有效。对于任何其他数组也是如此,您希望显式存储大小并使用它而不依赖于sizeof
    • @BenVoigt 嗯?我说的是字符串,而不是数组。
    • 并不是sizeof 不起作用,而是它测量不同的东西——存储量。而在这个问题中,似乎存储量就是他想知道的。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2016-06-22
    • 2015-01-31
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2019-11-18
    • 2013-09-10
    相关资源
    最近更新 更多