logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C]Atmega8 Obsługa UART i zapisu danych do tablicy

czopas 09 Kwi 2009 14:31 1601 0
REKLAMA
  • #1 6392945
    czopas
    Poziom 12  
    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:

    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ć ?
  • REKLAMA
REKLAMA