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

Xmega128A3U - printf działa, scanf nie działa przy użyciu UART

dawid.barracuda 07 Sie 2016 17:50 1746 15
REKLAMA
  • #1 15854669
    dawid.barracuda
    Poziom 13  
    Szanowni Forumowicze,
    uruchomiłem sobie sprzętowego UARTa wykorzystując bibliotekę ze strony atmela. Wszystko działa, łączę się z terminalem na komputerze, wyświetla się to co powinno. Dodałem też funkcję do wysyłania całego łańcucha znaków wykorzystując wskaźnik, gdyż w atmelowskiej bibliotece znalazłem jedynie do wysyłania konkretnych pojedynczych znaków. Wyczytałem też, że można do komunikacji wykorzystać strumienie printf i scanf. I o ile printf działa poprawnie to ze scanf mam problem. Kod może wydawać się obszerny ze względu na szczegółowe komentarze producenta i wyłączone przeze mnie pewne fragmenty kodu. Oto i kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zarówno kod do printf jak i scanf brałem z jednego źródła. Printf jak mówiłem działa, a scanf się opiera. Czym może być to spowodowane?
    Proszę uprzejmie o wskazówki i pozdrawiam,
    Dawid.

    PS: W załączniku cały mój projekt i wszystkie potrzebne pliki. Program pisany pod Xmega128A3U.
  • REKLAMA
  • Pomocny post
    #2 15855179
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #3 15855351
    jnk0le
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To jest raczej niepotrzebne.

    Sprawdź jeszcze jaki znak/i końca lini wysyła twój terminal i czego wymaga scanf().

    EDIT: Co właściwie oznacza to "opieranie się"?
  • #4 15856467
    dawid.barracuda
    Poziom 13  
    Korzystam z Putty i Realterma. Akurat to chciałem wykonać na Putty. Opcje obu terminali wyglądają tak:
    Xmega128A3U - printf działa, scanf nie działa przy użyciu UART
    Czyli w realtermie kiedy klikam "Send ASCII" mogę sobie dodać \n\r do wysyłanego łańcucha, czy tak?
    A w Putty żeby po enterze mieć linijkę od początku chyba powinienem zaznaczyć "Implicit CR..." czy tak?

    Odnośnie scanf i avr-libc: oto co mówi biblioteka:

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


    The function scanf performs formatted input from stream stdin.

    See vfscanf() for details.


    Znaczy to, że scanf wskazuje na znak/łańcuch znaków?
  • REKLAMA
  • Pomocny post
    #5 15856470
    grko
    Poziom 33  
    @dawid.barracuda
    Cytat:

    Znaczy to, że scanf wskazuje na znak/łańcuch znaków?

    Nie. Funkcja skanuje standardowe wejście w poszukiwaniu tego co przekazano przez parametr fmt.
  • Pomocny post
    #6 15856478
    jnk0le
    Poziom 18  
    dawid.barracuda napisał:

    A w Putty żeby po enterze mieć linijkę od początku chyba powinienem zaznaczyć "Implicit CR..." czy tak?

    To działa tylko przy odbiorze (dostajesz LF to putty "wyświetla" jeszcze CR), jeśli coś wysyłasz z PuTTy to zawsze jest to tylko CR.
  • #7 15856519
    dawid.barracuda
    Poziom 13  
    "Opieranie się" polega na tym, że jak otwieram połączenie w Putty to jak wpisuję znaki to nic się nie pojawia w terminalu. Printf działa prawidłowo.

    grko napisał:
    @dawid.barracuda
    Cytat:

    Znaczy to, że scanf wskazuje na znak/łańcuch znaków?

    Nie. Funkcja skanuje standardowe wejście w poszukiwaniu tego co przekazano przez parametr fmt.


    A do parametru fmt podaję to co aktualnie wpisuję w terminalu? I jak to powinno wyglądać? Powinienem zatwierdzać każdy znak enterem? Trochę mi się to wydaje bez sensu. Nie za bardzo chyba rozumiem działanie tych strumieni. Przy pisaniu na PC się nad tym nie zastanawiałem przyznam szczerze.

    Zamieszczam to, co mówi biblioteka nt. fmt (przy funkcji vfscanf() ):
    Cytat:
    The format string fmt is scanned for conversion specifications. Anything that doesn't comprise a conversion specification is taken as text that is matched literally against the input. White space in the format string will match any white space in the data (including none), all other characters match only itself. Processing is aborted as soon as the data and format string no longer match, or there is an error or end-of-file condition on stream.
  • REKLAMA
  • Pomocny post
    #8 15856552
    grko
    Poziom 33  
    Cytat:

    A do parametru fmt podaję to co aktualnie wpisuję w terminalu? I jak to powinno wyglądać? Powinienem zatwierdzać każdy znak enterem? Trochę mi się to wydaje bez sensu. Nie za bardzo chyba rozumiem działanie tych strumieni. Przy pisaniu na PC się nad tym nie zastanawiałem przyznam szczerze.


    Powinno to działać tak samo jak na PC. Jak chcesz jednego inta to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jak chcesz np 2 inty oddzielone znakami abc to robisz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    itd

    Funkcja ta również zwraca wartość, którą warto sprawdzać.
  • #9 15856671
    dawid.barracuda
    Poziom 13  
    Poprawiłem kod zgodnie z linkiem, który poleciłeś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A czy jest jakaś różnica odnośnie przesyłania scanfem string-ów? Pytam o Twoje przykłady o wysyłaniu int-ów.
    I jeszcze jedno - czy da się zrobić tak, że putty będzie mi wyświetlał na bieżąco znaki, które wpisuje przed wciśnięciem entera?
  • #10 15856688
    grko
    Poziom 33  
    Cytat:

    A czy jest jakaś różnica odnośnie przesyłania scanfem string-ów? Pytam o Twoje przykłady o wysyłaniu int-ów.


    Nie powinno być.

    Cytat:

    I jeszcze jedno - czy da się zrobić tak, że putty będzie mi wyświetlał na bieżąco znaki, które wpisuje przed wciśnięciem entera?


    Szukaj opcji "local echo". Jak to włączysz to wyrzuć oczywiście uart_putchar z funkcji getchar.
  • #11 15858905
    dawid.barracuda
    Poziom 13  
    PuTTy od wersji 0.52 wspiera local echo (http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-localecho)
    Aby je ustawić to trzeba wejść w opcje terminala po otworzeniu nowej sesji:
    Xmega128A3U - printf działa, scanf nie działa przy użyciu UART
    Domyślnie jest na "auto" zarówno local echo jak i local line editing. W praktyce oba wyłączone.

    Skorzystałem z kodu z Twojej wskazówki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jednak nie działa to jak przypuszczałem, tzn. mam komunikat "Wpisz dwie liczby", ale zaraz po tym program leci od początku, zupełnie jakby ignorował linijkę ze scanfem. Coś zrobiłem nie tak, ale co tym razem? :P
  • Pomocny post
    #12 15858924
    grko
    Poziom 33  
    Jak teraz twój program wygląda? Co zwraca funkcja scanf?
  • #13 15858962
    dawid.barracuda
    Poziom 13  
    Linijki odpowiadające za strumienie mam takie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 15858999
    grko
    Poziom 33  
    Ale program się resetuje czy jak? Przechodzi za funkcję scanf?
  • #15 15859056
    dawid.barracuda
    Poziom 13  
    Przechodzi za scanf.

    edit: jak przeniosłem to na sam początek zaraz po while(1) to on czeka jak coś wpiszę, tylko przechodzi dalej jak wpiszę mu kilka liczb (ok. 10) zamiast dwóch. Wtedy przechodzi dalej. Co więcej, po takiej akcji on już nie chce ode mnie znowu wpisywania tylko kręci się w kółko.
  • #16 15859442
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA