Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 lut 2025, o 22:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 23 lis 2014, o 20:13 
Offline
Nowy

Dołączył(a): 23 lis 2013
Posty: 19
Pomógł: 0

Przyjaciele, mam problem.
oto kod (biblioteki atmelowskie)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



(wybaczcie poziom zaawansowanie, jestem początkującym kucykiem:) )

nie wiem jak mam to poprawić, żeby warunki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wykonały się tylko raz po wpisaniu całego ciągu znaków do tablicy EAN[], potem następny raz jak zawartość będzie nadpisana itd.
Obecnie ciągle się zlicza. Miałem już działający kod, więc jest to do wykonania prostym sposobem, ale już zapomniałem jak to wymyśliłem, a kod mi "przepadł".
To jest wersja robocza więc stąd taki "ład".

Bardzo proszę o pomoc!
Odwdzięczę się dobrym sokiem jabłkowym:) jak ktoś się we Wrocławiu pojawi:) !!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 00:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Nie do końca wiem co Twój program robi bo nie wgłębiałem się ale chcę sie zapytać czy zdajesz sobie sprawę z tego, że "&" jest operatorem bitowym, a nie logicznym?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2014, o 15:55 
Offline
Nowy

Dołączył(a): 23 lis 2013
Posty: 19
Pomógł: 0

Może jednak ma ktoś pomysł... chociaż doradźcie jak jak za jednym zamachem ściągnąć wszystkie znaki do tablicy.
Żeby rozjaśnić dodam, że jest to kod, a raczej próba odtworzenia z głowy kodu, specyficznego kalkulatora.
Na poprzednim wsadzie kalkulator dostawał po RS-232 ciąg znaków, wybierał z tego te które odpowiadają za ilość i sumował je z kolejnymi nadchodzącymi po RS-ie. I działało to pięknie długi czas, aż nie zachciało mi się wprowadzić parę poprawek, na oryginalnym kodzie, bez zrobienia kopii. Tak sknociłem, że nie mogłem się połapać. :)


Niestety nie umiem już sobie przypomnieć jak zrealizowałem to, że gdy pojawił się znak 'CR', kalkulator pobierał znaki z tablicy i dodawał do poprzedniej sumy. Robił to raz, i czekał aż znów pojawi się 'CR', czyli że nowe znaki(cyfry) się pojawiły w tablicy.
Przy obecnym kodzie odbywa się to, albo tyle razy ile znaków napłynęło po RS-ie, albo cały czas po pierwszym wczytaniu ostatniego znaku do tablicy.
Nie potrafię tego przeskoczyć. To był/jest mój pierwszy poważny projekt. Proszę o wyrozumiałość i pomoc.
Też kiedyś zaczynaliście... chyba:)

dzięki!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2014, o 17:57 
Offline
Nowy

Dołączył(a): 25 lis 2014
Posty: 18
Pomógł: 4

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ąć.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO