Witam.
Mam mały problem związany z obsługą UART i zarazem z tablicami.
Program ma za zadanie odbiór danych zakończonych znakiem <CR> <LF>. Dla przykładu odebrany ciąg znaków jest następujący:
Korzystam z przerwania SIG_UART_RECV a jego obsługa jest następująca:
Oczywiście na początku programu ustawiam bit_start = 1 oraz bit_stop = 0. Zmienna "i" służy do przesuwania pozycji w tablicy.
No i teraz funkcja obsługująca odebrane dane:
Do tego momentu wszystko gra jak należy. Odbieramy tylko linię "bla bla" ze znakiem <CR>. Powiedzmy, że po 5 sekundach znów chce wywołać tę samą funkcję. W rezultacie otrzymuję tak jakby końcówkę zawartości tablicy uart_dane (czyli "bu bu") a nie oczekiwane przeze mnie "bla bla <CR>".
Próbowałem dokonywać czyszczenia tablicy (poprzez wpisywanie do każdego jej pola jakiegokolwiek znaku) ale to nie pomaga. Tablica powinna zostać nadpisana od samego początku (gdyż i = 0 zostało wywołane).
Domyślam się, że trzeba tutaj użyć jakiś wskaźników ale nie mam pojęcia gdzie i jak to użyć, żeby to wszystko ładnie działało.
Może ktoś wie co trzeba tu poprawić ?
Mam mały problem związany z obsługą UART i zarazem z tablicami.
Program ma za zadanie odbiór danych zakończonych znakiem <CR> <LF>. Dla przykładu odebrany ciąg znaków jest następujący:
bla bla <CR> <LF>
bu bu <CR> <LF>Korzystam z przerwania SIG_UART_RECV a jego obsługa jest następująca:
SIGNAL(SIG_UART_RECV)
{
uart_odebrane = UDR;
if((uart_odebrane == CR) && (bit_start == 1))
{
bit_stop = 1;
bit_start = 0;
UCSRB&=~(1<<RXEN);// wyłączenie nadajnika aby nie odbierał 'bu bu'
}
if(bit_stop != 1)
{
uart_dane[i] = uart_odebrane;
i++;
}
}Oczywiście na początku programu ustawiam bit_start = 1 oraz bit_stop = 0. Zmienna "i" służy do przesuwania pozycji w tablicy.
No i teraz funkcja obsługująca odebrane dane:
void odczyt(void)
{
uart_tx_text("komenda");// urządzenie po drugiej stronie na nią odpowiada
while(bit_stop != 1) {}
uint8_t licznik;
for(licznik = 0; licznik < 16; licznik++)
lcd_data(uart_dane[licznik]);
uart_flush();
UCSRB|=(1<<RXEN);
bit_stop = 0;
bit_start = 1;
i = 0;
}Do tego momentu wszystko gra jak należy. Odbieramy tylko linię "bla bla" ze znakiem <CR>. Powiedzmy, że po 5 sekundach znów chce wywołać tę samą funkcję. W rezultacie otrzymuję tak jakby końcówkę zawartości tablicy uart_dane (czyli "bu bu") a nie oczekiwane przeze mnie "bla bla <CR>".
Próbowałem dokonywać czyszczenia tablicy (poprzez wpisywanie do każdego jej pola jakiegokolwiek znaku) ale to nie pomaga. Tablica powinna zostać nadpisana od samego początku (gdyż i = 0 zostało wywołane).
Domyślam się, że trzeba tutaj użyć jakiś wskaźników ale nie mam pojęcia gdzie i jak to użyć, żeby to wszystko ładnie działało.
Może ktoś wie co trzeba tu poprawić ?