Преобразование из int в байтовый массив, а затем обратно в int с использованием atoi и itoa на Arduino для передачи
Я конвертирую подписанное int для отправки через Arduino Wire в виде нескольких байтов, поэтому я сделал следующее:
Приведенный ниже код является отладкой моей реализации, вы можете скопировать в IDE Arduino, чтобы увидеть распечатку.
Что я не могу понять, так это то, как 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
1 ответ
Вы перезаписываете память, вызывая неопределенное поведение.
Также, itoa()
не создает "байтовый массив", он создает строку. Название означает "целое число в ASCII". В документации сказано:
Звонящий несет ответственность за обеспечение достаточного хранения [...]
Наконец, длина строки вычисляется как strlen()
не sizeof
,