Na podstawie tego wycinka kodu ciężko jest stwierdzić, dlaczego ten fragment Ci nie działa.
Z jakiej biblioteki korzystasz też nie napisałeś dokładnie. Zapewne tej dostępnej z
http://beaststwo.org/avr-uart/.
Na początku powinieneś zwrócić uwagę na to jak działa funkcja
uart_getc().
Na przykładzie biblioteki ze strony której podałem masz opis w uart.h
Kod:
/**
* @brief Get received byte from ringbuffer
*
* Returns in the lower byte the received character and in the
* higher byte the last receive error.
* UART_NO_DATA is returned when no data is available.
*
* @param void
* @return lower byte: received byte from ringbuffer
* @return higher byte: last receive status
* - \b 0 successfully received data from UART
* - \b UART_NO_DATA
* <br>no receive data available
* - \b UART_BUFFER_OVERFLOW
* <br>Receive ringbuffer overflow.
* We are not reading the receive buffer fast enough,
* one or more received character have been dropped
* - \b UART_OVERRUN_ERROR
* <br>Overrun condition by UART.
* A character already present in the UART UDR register was
* not read by the interrupt handler before the next character arrived,
* one or more received characters have been dropped.
* - \b UART_FRAME_ERROR
* <br>Framing Error by UART
*/
extern unsigned int uart_getc(void);
I dalej po wykonaniu uart_getc zwracany jest typu unsigned int ( 2 bajty ), gdzie w starszym bajcie jest info o statusie, w młodszym przekazany kod znaku o ile jest zwrócony został status 0 ( poprawnej transmisji )
Odnosząc się znowu do biblioteki, którą podałem, to jak sobie podejrzysz plik nagłówkowy ( ten z rozszerzeniem .h ) to zauważysz, że nie ma tam funkcji do pobrania całego ciągu znaku na raz. Musisz to obsłużyć sam. W moim przekonaniu najlepiej byłoby jakbyś funkcję uart_getc() wrzucił w pętlę do {instrukcje do wykonania} while(warunek); coś na wzór
Kod:
do {
l = uart_getc()
} while ( warunek )
Pętla do{}while() powinna się wykonywać do momentu jeżeli nie zostanie przesłany znak Enter w zmiennej l w młodszym bajcie ( jako sygnał zakończenia wprowadzania danych lub do momentu osiągnięcia końca buforu EAN( czyli pewno maks 16 znaków - jak na wyświetlaczu, przy założeniu, że stosujesz wyświetlacz 16 kolumnowy). To są założenia gdy starszy bajt zwraca "0" czyli successfully received data from UART. Błąd transmisji też wypadałoby obsłużyć w jakiś sposób, ale tego nie będę poruszał.
Idąc dalej chcesz wejść do if'a
Kod:
if ((ean==1))
{
.
.
}
po ustawieniu zmiennej ean w if'ie:
Kod:
if(((EAN[13]=='\r'))&(i==0)) // [b]<= tutuj jest błąd merytoryczny. Robisz iloczyn bitowy ( & ) zamiast AND logiczny ( &&)[/b]
{
ean=1; //kod w całoci w tablicy EAN[]
}
Po pierwsze jak zrobisz zczytywanie znaków w pętli do{}while() to z tego fragmentu (z tych dwóch if'ów) będziesz mógł zrezygnować, bo będzie wiadomo, że masz wypełniony już bufor EAN. Sprawdzanie nie będzie konieczne.
I jeszcze co do przedstawionego if'a. Zakładasz, że na pozycji 13 buforu EAN będziesz miał znak '\r'. Czy to jest założenie poprawne?
Dodatkowo musiałbyś wyjaśnić co dla Ciebie oznacza zmienna
i, a także w dalszej części kodu
e,
ean13, itd. Z przedstawionego kodu nie wynika w jaki sposób te zmienne są ustawiane, po co i co oznaczają. Zaznaczyłem również we fragmencie kodu z if, gdzie masz błąd. Kompilator Ci nie krzyknie błędem, bo taka składnia w C jest dopuszczalna, ale zamiar chyba miałeś inny.
Opis jest trochę zakręcony, ale powyższe uwagi myślę, że powinny Ciebie częściowo naprowadzić na cel jaki chcesz osiągnąć.