Witam
Nie wiem jak to nazwac.
Probuje napisac funkcje, ktora z wyslanego pliku przez rs232 bedzie odczytywala znak po znaku.
Plik do odebrania wyglada np tak
Po znaku 'r' podana jest wartosc hexadecymalna, tzn procesor ma ja tak traktowac. Wszystko inne jak np 2 i 4 linijke ma pomijac. Robie to tak
jezeli napotka znak 'r' ma pobrac kolejny znak i traktowac go jako 4 starsze bity zmiennej wynik, nastepnie pobrac kolejny znak i traktowac jako 4 mlodze bity zmiennej wynik, z czego po zlozeniu zmienna wynik jak w 1 linijce przykladowego pliku ma wartosc 8f
Tyle w teori, w praktyce odczytuje mi z pliku tylko 1 linijke, reszte pomija i wychodzi z funkcji. Juz nie mam pomyslow dlaczego.
Kod funkcji
Bede wdzieczny za kazda sugestie
I takie pytanie dodatkowe: Jak wykryc znak konca linii? '\n' i '\r' nie dziala
Nie wiem jak to nazwac.
Probuje napisac funkcje, ktora z wyslanego pliku przez rs232 bedzie odczytywala znak po znaku.
Plik do odebrania wyglada np tak
Cytat:
r8f
56
rac
79
r67
$
Po znaku 'r' podana jest wartosc hexadecymalna, tzn procesor ma ja tak traktowac. Wszystko inne jak np 2 i 4 linijke ma pomijac. Robie to tak
jezeli napotka znak 'r' ma pobrac kolejny znak i traktowac go jako 4 starsze bity zmiennej wynik, nastepnie pobrac kolejny znak i traktowac jako 4 mlodze bity zmiennej wynik, z czego po zlozeniu zmienna wynik jak w 1 linijce przykladowego pliku ma wartosc 8f
Tyle w teori, w praktyce odczytuje mi z pliku tylko 1 linijke, reszte pomija i wychodzi z funkcji. Juz nie mam pomyslow dlaczego.
Kod funkcji
void USART_getfile (void)
{
u08 tmp;
u08 wynik;
register char ch=0;
while (ch != '$')
{
//WDR(); // restart licznika Watchdoga
ch=USART_Receive(); // pobieraj znak
if (ch=='$') break; //koniec pliku
/*if (ch=='%') //pomin komentarze do konca linii
while (ch != '\n')
ch=USART_Receive(); */
if (ch == 'r')
{
ch=USART_Receive();
if ((ch >= '0') && (ch <= '9'))
{
tmp = ch - '0';
wynik=tmp<<4;
LCD_clear();
LCD_putstr(" pkt 1 ");
KBD_keypls();
}
else if ((ch >= 'a') && (ch <= 'f'))
{
tmp = ch - 'a' + 10;
wynik=tmp<<4;
LCD_clear();
LCD_putstr(" pkt 2 ");
KBD_keypls();
}
else if ((ch >= 'A') && (ch <= 'F'))
{
tmp = ch - 'A' + 10;
wynik=tmp<<4;
LCD_clear();
LCD_putstr(" pkt 3 ");
KBD_keypls();
}
//druga polowa
ch=USART_Receive();
if ((ch >= '0') && (ch <= '9'))
{
tmp = ch - '0';
wynik=wynik+tmp;
LCD_clear();
LCD_putstr(" pkt 4 ");
KBD_keypls();
}
else if ((ch >= 'a') && (ch <= 'f'))
{
tmp = ch - 'a' + 10;
wynik=wynik+tmp;
LCD_clear();
LCD_putstr(" pkt 5 ");
KBD_keypls();
}
else if ((ch >= 'A') && (ch <= 'F'))
{
tmp = ch - 'A' + 10;
wynik=wynik+tmp;
LCD_clear();
LCD_putstr(" pkt 6 ");
KBD_keypls();
}
LCD_clear();
LCD_putstr("Rejestr: ");
LCD_puthex(wynik);
KBD_keypls();
}//if 'r'
}//while '$'
}//koniec funkcjiBede wdzieczny za kazda sugestie
I takie pytanie dodatkowe: Jak wykryc znak konca linii? '\n' i '\r' nie dziala