Со ссылкой на следующий код: После вызова функции CheckSMS
и передачи структуры * DB1
поля обновляются в соответствии с вызовом strtok
. Эта функция считывает и анализирует текстовое сообщение, сохраняя его содержимое в полях char * структуры БД.Сброс функций вызова передал глобальные поля структур
В основном цикле я позвонил Serial.println(DB1.last_order)
до и после вызова функции CheckSMS
. Если я получил текст, заказ печатается соответствующим образом в основном цикле, однако при следующем вызове CheckSMS очищается DB1.last_order
, заменяется на \ n или NULL или что-то в этом роде. Я не могу понять, почему DB1.last_order
не сохраняет свое значение и, скорее, перезаписывается при каждом вызове CheckSMS. Спасибо за любую помощь.
Примечание. Все текстовые сообщения содержат «CMT +», поэтому запись в DB1 происходит только при получении текста. Вызов CheckSMS
, когда текст не получен, нужно просто пропустить.
int CheckSMS(Robot *DB1) {
int j = 0;
char response[100];
char *pch;
unsigned long previous;
memset(response, '\0', 100);
while(Serial2.available()>0){
response[j] = Serial2.read();
j++;
Serial.println("inc");
}
delay(100);
if (strstr(response, "CMT:") != NULL){
DB1->new_message = strtok(response, " ,");
DB1->last_phone = strtok(NULL, " ,");
pch = strtok(NULL, " ,");
DB1->last_date = strtok(NULL, " ,");
DB1->last_time = strtok(NULL, " ,\n");
DB1->last_order = strtok(NULL," ,\n");
new_message = 1;
}
else{
}
return 0;
}
Предполагая, что вы действительно прочитали данные, как только эта функция вернет все указатели 'char *', которые вы вырвали из этих вызовов 'strtok' и сохранили в' DB1', будет свисать (например, уже недействительно), поскольку буфер, к которому они ссылаются (указывать), 'response []', больше не существует. [** Этот пост **] (https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794) * серьезно * стоит читать. – WhozCraig