Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

XMEGA256A3U - Timeout do funkcji scanf

lukasz94w 28 Lip 2016 16:11 960 7
  • #1 28 Lip 2016 16:11
    lukasz94w
    Poziom 4  

    Witam,
    piszę program na moją xmege i poszukuję rozwiązania następującego problemu. Operuję na strumieniach (komunikacja za pomocą UART'u) i mam za zadanie: wczytać jakiś ciąg (nieokreślonych) znaków wpisywanych przykładowo w terminalu na PC, gdy po jakimś czasie nic nie zostanie wpisane program wyświetla komunikat o upływie wyznaczonego czasu i powraca do stanu początkowego. Używałem funkcji scanf, jednak cały czas program "czeka" na wpisanie czegokolwiek i nie pozwala mi na zrealizowanie założonego celu. Czy ktoś z forumowiczów zna sposób na rozwiązanie tego problemu? Pozdrawiam

    0 7
  • Pomocny post
    #2 28 Lip 2016 16:37
    JacekCz
    Poziom 33  

    wczytać niskopoziomowo.
    Nie mam pojęcia czego i jak używasz (kawałek kodu???), więc nie powiem dokładniej.
    Żadna funkcja standardowa operująca na poziomie FILE nie ma obsługi timeoutu.

    Liczne użycie scanf jakie można znaleźć w necie, rzadko są sensowne. scanf pokazuje możliwości przy parsowaniu, większej ilości zmiennych jednocześnie wczytywanych itd... W większości popularnych fragmentów jest zbędny (również niepotrzebnie kosztowny) i w pełni do zastąpienia.

    0
  • #3 28 Lip 2016 16:45
    2749043
    Usunięty  
  • Pomocny post
    #4 28 Lip 2016 17:28
    Piotrus_999
    Poziom 40  

    Prawie nie do zrealizowania samym scanf.

    Moesz co prawda napisac wasną funkcję obsługi stdio ale problem jest że nie wpływa to na przerwanie sscanf. Jest to generalnie ciężko obejść jako że nie ma zaimplementowanej funkcji select np.

    Musisz czytać własnymi funkcjami uarta i pisac do bufora - kiedy bufor jest pełny (tzn np osiągnie odpowiednią ilość znaków lub otrzymał jakiś znak np '\n') to wtedy wywołujesz sscanf.

    widziałem "cudaki" np funkcja obsługujaca stdin zwracała jakiś znak po timeout dopóku scanf nie wyszedł z błedem (czyli ilość zeskanowanych inna niz załozona) - ale to są metody głupie.

    0
  • #5 28 Lip 2016 17:34
    JacekCz
    Poziom 33  

    Piotrus_999 napisał:

    Musisz czytać własnymi funkcjami uarta i pisac do bufora - kiedy bufor jest pełny ... to wtedy wywołujesz sscanf.


    Jak ja czytam zagadnienie, nie wynika że analiza/konwersja tego bufora jest w ogóle potrzebna "wczytać jakiś ciąg (nieokreślonych) znaków".
    Przyjęło się używac scanf'a ale nie zawsze potrzebnie. Ciąg dowolnych znaków w "klasycznym C" pobiera się np gets i kilkoma innym do wyboru.

    0
  • #6 28 Lip 2016 17:39
    Piotrus_999
    Poziom 40  

    JacekCz napisał:
    Jak ja czytam zagadnienie, nie wynika że analiza/konwersja tego bufora jest w ogóle potrzebna "wczytać jakiś ciąg (nieokreślonych) znaków".


    Scanf raczej do dokładnie określonych ciągów znaków. np integerów, floatów, znaków, które maja być pominiete, usuwania whitespace i paru innych.

    Zeby wykryć ze w ciągu jest np 'g' lub jakiś ciąg znaków to rzeczywiście nieporozumienie.

    0
  • #7 11 Sie 2016 13:08
    lukasz94w
    Poziom 4  

    Dziekuje wszystkim za odpowiedzi, przepraszam ze tak pozno ale juz poradzilem sobie z problemem. Pozdrawiam

    0
  • #8 11 Sie 2016 18:07
    JacekCz
    Poziom 33  

    lukasz94w napisał:
    Dziekuje wszystkim za odpowiedzi, przepraszam ze tak pozno ale juz poradzilem sobie z problemem. Pozdrawiam


    zasadą elektrody, wspartą regulaminem, jest krótkie podanie "jak rozwiązałem problem". jest jakaś wdzięczność dla ludzi którzy (próbowali) pomóc. Oczywiście "dla potomnych" szukających tego samego problemu kiedyś.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo