Этот код:
while( array[i] != NULL){
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}
записывает в array[3]
и array[4]
, которые находятся за пределами. Поле давления имеет значение array[0]
, а NULL - array[4]
.
Изменить на:
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
, который перезаписывает указатель на array[0]
с типом сообщения, которое вы отбрасываете, и выполняет итерацию до тех пор, пока все поля не будут извлечены, а не когда strtok()
вернет NULL ,
Затем измените индексы в atof()
:
float t = atof(array[0]);
float h = atof(array[1]);
float p = atof(array[2]);
Вы также можете проверить правильность типа сообщения.
array[i] = strtok(data,separator); //first token
if( array[i][0] == '1' && array[i][1] == 0 )
{
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
}
Если вы действительно хотели чтобы сохранить тип сообщения, для array
требуется 4 элемента, а тело l oop станет:
i++ ;
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
Вы можете предварительно увеличить array[++i]
в соответствии с исходным кодом, но я бы хотел не рекомендуется - это не служит ясности, а семантика и последовательность усложняются при использовании в более сложных выражениях - всегда используйте его «автономно», чтобы избежать ошибок и недоразумений.