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