У меня есть простая программа на C, работающая на архитектуре ARM.У нас есть два глобальных массива:
char RxB[400];
char GPS[150];
У меня есть такая функция, которая ищет и находит подстроку между key
и termChar
.Подстрока результата определяется как параметр функции:
SEARCH_STATUS findString_chr(char *src, char *key, int key_size, char termChar, char *dst, int desLen)
{
char *temp, *tempchar;
temp = strstr(src, key);
if (temp == NULL)
return STR_KEY_NOT_FOUND;
else
temp += key_size;
tempchar = strchr(temp, termChar);
if (!tempchar)
return STR_TERMINATOR_NOT_FOUND;
uint8_t siz = (uint8_t)(tempchar - temp);
if (siz > desLen)
return STR_OVERFLOW;
memcpy(dst, temp, siz);
dst[siz] = '\0';
return STR_FOUND;
}
В моем main.c у меня есть простой код, подобный этому:
do {
ST = findString_chr(RxB, key, strlen(key), '$', GPS, 150);
// Some delay here
// Some other codes
} while (some conditions);
Примечаниечто значение RxB
меняется каждую 1 секунду, поскольку оно получается из последовательной связи.
Моя проблема в том, что, как я знаю, после выхода из функции findStringchr
значение GPS
не должнобыть изменены, потому что никто не манипулирует его элементами.Но когда я отлаживаю свой код, я вижу, что значение массива GPS
все еще меняется.
У кого-нибудь есть идеи?
PS: main.c более подробно:
cnt = 0;
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
do {
ST = findString_chr(RxB, key, strlen(key), '$', GPS, 150);
findString_chrchr(GPS, 2, st, 2);
if ((st[0] == 'A') && (ST == STR_FOUND)) {
findString_chrchr(GPS, 3, lati, 10);
findString_chrchr(GPS, 5, longi, 11);
sendState = GPS_ACTIVE;
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,GPIO_PIN_RESET);
}
HAL_Delay(1000);
HAL_IWDG_Refresh(&hiwdg);
gpsCounter++;
if (gpsCounter > (TIMEOUT_GPS/1000)) {
sendState = GPS_TIMEOUT;
memcpy(lati, "1111.1111", 10);
memcpy(longi, "01111.1111", 11);
gpsCounter = 0;
}
} while ((sendState == GPS_VOID) && (cnt != 1));
Функция findStringchrchr()
возвращаетподстрока между двумя последующими запятыми:
SEARCH_STATUS findString_chrchr(char *src, int commaNumber, char *dst, int desLen) {
char *temp = src, *end;
int cnt = 0;
while (1) {
temp = strchr(temp, ',') + 1;
if (!temp)
return STR_KEY_NOT_FOUND;
else {
cnt++;
if (cnt == commaNumber) {
end = strchr(temp, ',');
int D = (end - temp);
if (D >= desLen)
return STR_OVERFLOW;
if (D == 0)
dst[0] = '\0';
} else {
memcpy(dst, temp, D);
dst[D] = '\0';
}
break;
}
}
}
return STR_FOUND;
}