Witam koledzy, po raz kolejny potrzebuję waszej pomocy. Przejdę od razu do rzeczy. Do portu UART1 mam podłączone urządzenie, które wysyła informacje w następującym formacie:
$C299.2P2.2R93.3T23.1*1C
Potrzebuję z niej wydobyć 3 liczby następujące po literach C, P oraz R. Liczby te mogą być ujemne bądź dodatnie, znam ich maksymalną wartość.
Długo wzbraniałem się przed używaniem wskaźników, no ale w tym przypadku było to wyjście najrozsądniejsze. Poniżej kod obsługi przerwania wywołanego przez przyjście znaku na UART1:
Jak dla mnie kod wydaje się prosty i nie widzę gdzie tu może występować błąd. Jednak moje próby debugowania przez wstawianie printf do poszczególnych case wskazują że problemem jest pierwsza linijka default, mianowicie:
*valuepick = UART1char;
Jak ją skomentuję to program"działa", to znaczy otrzymuje dane z powstawianych printfów, czyli program wchodzi do poszczególnych casów. Natomiast kiedy jest nieskomentowana, wejście do default powoduje zawieszenie. Nie wiem co jest nie tak, proste przekazanie wartości do miejsca wskazanego przez pointer. Nie wykluczam, że pewnie gdzieś są inne błędy, ale nie mogę ich znaleźć póki tego nie rozwiąże. Bez tej linijki program nie będzie działał poprawnie. Proszę was zatem o pomoc.
$C299.2P2.2R93.3T23.1*1C
Potrzebuję z niej wydobyć 3 liczby następujące po literach C, P oraz R. Liczby te mogą być ujemne bądź dodatnie, znam ich maksymalną wartość.
Długo wzbraniałem się przed używaniem wskaźników, no ale w tym przypadku było to wyjście najrozsądniejsze. Poniżej kod obsługi przerwania wywołanego przez przyjście znaku na UART1:
static unsigned char UART1char, heading[6],pitch[6],roll[7],*valuepick = NULL;
static double headingval, pitchval, rollval;
UART1char = U1RBR;
switch (UART1char)
{
case 'C': valuepick = &heading; \\wskaznik na heading
break;
case 'P': *valuepick = '\0'; \\wstaw '\0' do heading
valuepick = &pitch; \\ wskaznik na pitch
break;
case 'R': *valuepick = '\0'; \\wstaw '\0' do pitch
valuepick = &roll; \\wskaznik na roll
break;
case 'T': *valuepick = '\0'; \\wstaw '\0' do roll
headingval = atof(&heading); \\zamien string na double
pitchval = atof(&pitch);
rollval = atof(&roll);
valuepick = NULL;
break;
default: *valuepick = UART1char; \\wstaw cyfre do aktualnego wskazania wskaznika
valuepick++; \\przesun wskaznik na nastepna komorke stringa
break;
}Jak dla mnie kod wydaje się prosty i nie widzę gdzie tu może występować błąd. Jednak moje próby debugowania przez wstawianie printf do poszczególnych case wskazują że problemem jest pierwsza linijka default, mianowicie:
*valuepick = UART1char;
Jak ją skomentuję to program"działa", to znaczy otrzymuje dane z powstawianych printfów, czyli program wchodzi do poszczególnych casów. Natomiast kiedy jest nieskomentowana, wejście do default powoduje zawieszenie. Nie wiem co jest nie tak, proste przekazanie wartości do miejsca wskazanego przez pointer. Nie wykluczam, że pewnie gdzieś są inne błędy, ale nie mogę ich znaleźć póki tego nie rozwiąże. Bez tej linijki program nie będzie działał poprawnie. Proszę was zatem o pomoc.