Никак не могу понять, отчего проблема возникает.
Код: Выделить всё
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE)) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE); }
if (USART1->DR!='\r' && USART1->DR!='\n') {s1[counter]=USART1->DR; counter++;} else {s1[counter]=0x00; if (USART1->DR=='\n')
{
counter=0;
strcpy(s2,s1);
sscanf (s2,"$%[^,]",s3);
if (strcmp(s3,"GPRMC")==0) {
if (s2[18]=='A') {STM32vldiscovery_LEDOn(LED3);} else {STM32vldiscovery_LEDOff(LED3);};
scopy(s2,s4,7,2);
hr=atoi(s4)+utcplus;
scopy(s2,s4,9,2);
mn=atoi(s4);
scopy(s2,s4,11,2);
sc=atoi(s4);
sprintf(b, "%2.2d.%2.2d.%2.2d", hr, mn, sc);
scopy(s2,s4,20,8);
d=strtod(s4, NULL);
};
};
};
};
Код: Выделить всё
void scopy(char *in, char *out, short start, short len) {
short m1;
for (m1=start;m1<start+len;m1++) {out[m1-start]=in[m1];};
out[m1+1]=0x00;
};
В переменной b, которая должна содержать время вида ЧЧ.ММ.СС вылезает чушь.
Если убрать из обработчика прерывания строчки scopy(s2,s4,20,8); d=strtod(s4, NULL);, то всё нормально.
Также, если поменять переменную для копирования в этих строках (scopy(s2,s5,20,8); d=strtod(s5, NULL);), то тоже нормально, но я не хочу делать лишние, их и так уже 4 (s1 - переписываемый буфер, обновляется побайтно; s2 - полностью принятая строка для обработки, меняется с каждым полным сообщением; s3 - идентификатор сообщения; s4 - временная).
По идее, строка обрабатывается только при наличии конца сообщения, и только если оно GPRMC. Данные других строк не могут попасть. Потом, переменную b я не трогаю после печати в неё знаков, но это значит, что изначально печатаемые данные неверны. Откуда ж они берутся? Или это я чего-то в scopy() намутил с указателями? Она просто копирует кусок строки в другую, и завершает нулём.
Спасибо.