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]Uart funckja Recieve z Data Sheeta

xamrex 03 Lip 2011 19:26 813 1
REKLAMA
  • #1 9678006
    xamrex
    Poziom 28  
    Witam.
    Napisałem sobie taki program, który wyświetla na wyśw 7segmentowym jakąś cyfrę.
    wygląda to tak: (plik mian.c)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Plik led.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i wszystko działa, a wg. mnie działać nie powinno.

    Po podłączeniu zasilania, na wyśw. mam cyfrę 0.
    Jeśli kliknę na klawiaturze komputera cyfrę np. 5 to od razu na wyświetlaczu 7seg pojawia mi się cyfra 5.

    Sprecyzuje może co wg. mnie działać nie powinno.
    Otóż mamy pętlę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W niej wg. mnie cały czas uc pobiera dane, które są wysyłane przez RS232, więc zgadzam się, jeśli kliknę przycisk 5 to na wyświetlaczu 7seg przez bardzo krótki okres czasu powinna zaświecić się cyfra 5, ale potem znowu jak będzie przechodziła pętla od nowa, to przecież nasz RS232 nie będzie już nic odbierał(bo nie będę miał naciśniętego na klawiaturze PC klawisza 5) więc funkcja USART_Receive() powinna cały czas zwracać 0 (bo nie ma nic naciśniętego na klawiaturze)
    co w pętli powinno wyglądać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W wyniku czego powinniśmy na wyświetlaczu 7seg dostać coś dziwnego a nie tą cyfrę którą kliknęliśmy

    Reasumując czy jeśli zrobimy taką pętlę:(i nic nie będziemy wysłać przez RS'a)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To czy po każdym "przeleceniu" pętli w zmiennej wyniki będzie nam się zapisywała cyfra 0, czy nie?
  • REKLAMA
  • Pomocny post
    #2 9678113
    mirekk36
    Poziom 42  
    odpowiedź jest bardzo prosta, sam zobacz na fragment swojej funkcji do odbioru:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    czy nie widzisz, że do czasu gdy coś nie zostanie odebrane cała pętla czeka w tym momencie na znak???? i nic się nie dzieje

    to dlatego twój znak 5 cały czas się wyświetla

    a jak klikniesz w terminalu kolejny to sytuacja się powtarza ;)

    jednym słowem mówiąc twoja funkcja USART_Receive jest blokująca, a gdybyś napisał nieblokującą to miałbyś taką sytuację jaką powyżej próbowałeś przewidzieć ;)
REKLAMA