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

WinAPI jak dostać przerwanie gdy przychodzą dane na RS232

daniel93 12 Wrz 2012 15:07 3015 27
REKLAMA
  • #1 11303434
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Witam,

    Mam taką funkcję w C++ z jakiejś biblioteki do odbierania danych z RS232:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niestety i tak nie do końca rozumiem działanie tej funkcji... Bo muszę wpisać długość odebranych danych - a skąd mam wiedzieć ile przyszło? :|

    Ale do rzeczy: chcę zeby dane przychodzące powodowały coś w stylu "przerwania" znanego z mikrokonrolerów. Czyli program sobie działa, działa, przychodzą dane i program odbiera przychodzące dane. Wydaje mi się, że trzeba to przerobić na wątki, ale nie do końca wiem jak :|

    W Internecie jest sporo przykładów, ale każdy jest ZUPEŁNIE inaczej napisany a o dokładny opis po polsku ciężko
  • REKLAMA
  • #2 11303613
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Ta funkcja wpisuje ilość danych jakie przeczytała. Nigdzie się tego nie podaje.
  • #3 11303634
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    gaskoin napisał:
    Ta funkcja wpisuje ilość danych jakie przeczytała. Nigdzie się tego nie podaje.

    Hmmm czyli len to tylko wielkość bufora?

    Znalazłem opis jak zrobić to o co mi chodzi:
    Mustela73 napisał:
    rejestrujecz event na COM'a, albo przed wywolaniem funkcji ReadFile(...) sprawdzasz ile bajtow jest w buforze:


    DWORD Errors = 0;
    BOOL Result;
    COMSTAT ComStatus;

    Result = ClearCommError( hComPort, &Errors,
    &ComStatus );

    w
    DWORD Data2Read = ComStatus.cbInQue;
    masz liczbe bajtow w buforze wejsciowym
    teraz mozesz odczytac:

    Result = ReadFile( hComPort, &Data, Data2Read, &DataInBuffer, NULL );


    Ale nie wiem jakby to miało wyglądac w praktyce: co się kryje pod pojęciem rejestruje event "na coma" - czyli jak?

    Pokazałby mi ktoś jak to zastosować w praktyce?
  • REKLAMA
  • #5 11305421
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Wiem, ale nie mogę znaleźć jak zrobić, żeby ten wątek się sam wywoływał jak odbierze jakieś dane :-(

    Mógłbyś mi napisać jak zdefiniować wątek w ten sposób?

    Coś takiego znalazłem:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ale nie wiem jak to uruchomić :-(
  • #6 11305455
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Ten kod jest napisany w C#, nie licząc błędu z &.

    daniel93 napisał:
    Wiem, ale nie mogę znaleźć jak zrobić, żeby ten wątek się sam wywoływał jak odbierze jakieś dane :-(


    Wątek ma sprawdzać czy są dostępne dane i gdy są to wtedy wołać zdarzenie.
  • #7 11305473
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    gaskoin napisał:
    Wątek ma sprawdzać czy są dostępne dane i gdy są to wtedy wołać zdarzenie.

    O to mi cały czas chodzi ale dalej nie wiem jak to zrobić...
  • REKLAMA
  • #9 11305552
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Wujcia używam od 10 rano czyli już 14godzine szukając rozwiązania i nie daje już rady. Funkcja z tamtej strony sie nie kompiluje.... Już powoli sie poddaje
  • #10 11305561
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    daniel93 napisał:
    Funkcja z tamtej strony sie nie kompiluje
    Bo to nie jest gotowa funkcja, tylko pewien drogowskaz - przykład do samodzielnego poprawienia. Co masz na myśli p.t. "sie nie kompiluje" ? Takie problemy rozwiązuje się tylko na logikę.
  • #11 11305576
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    LordBlick napisał:
    przykład do samodzielnego poprawienia

    Po 14 godzinach tez miałbyś już dość poprawiania tego samego fragmentu....
    LordBlick napisał:
    Co masz na myśli p.t. "sie nie kompiluje"

    Wywala sterte błędów
    LordBlick napisał:
    Takie problemy rozwiązuje się tylko na logikę.

    Przeciez nie rozwiązuje ich łomem...


    Zrobiłem coś takiego:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    W funkcji int main() zadeklarowałem to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ale wywala takie błędy:
    C:\C++\UART\main.cpp||In function 'void ReadUART(void*)':|
    C:\C++\UART\main.cpp|19|error: 'hPort' was not declared in this scope|
    C:\C++\UART\main.cpp||In function 'int main()':|
    C:\C++\UART\main.cpp|40|warning: unused variable 'hThread'|
    ||=== Build finished: 1 errors, 1 warnings ===|
  • #12 11305599
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Użyj hPort=CreateFile()... z odpowiednim wyłapywaniem błędów.
    daniel93 napisał:
    Po 14 godzinach tez miałbyś już dość poprawiania tego samego fragmentu....
    W takim razie życzę dobrej nocy, rano będzie jaśniejsza sytuacja ;)
  • #13 11305616
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Tak miało być?
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wywala takie błędy:
    C:\C++\UART\main.cpp||In function 'void ReadUART(void*)':|
    C:\C++\UART\main.cpp|19|error: 'hPort' was not declared in this scope|
    c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\winbase.h|1221|error: too few arguments to function 'void* CreateFileA(const CHAR*, DWORD, DWORD, _SECURITY_ATTRIBUTES*, DWORD, DWORD, void*)'|
    C:\C++\UART\main.cpp|19|error: at this point in file|
    C:\C++\UART\Uart.h||In function 'int main()':|
    C:\C++\UART\Uart.h|6|error: too few arguments to function 'bool SetupUart(const char*, int, int, int, int)'|
    C:\C++\UART\main.cpp|29|error: at this point in file|
    C:\C++\UART\main.cpp|41|warning: unused variable 'hThread'|
    ||=== Build finished: 5 errors, 1 warnings ===|
    


    Dodano po 1 [minuty]:

    LordBlick napisał:
    rano będzie jaśniejsza sytuacja :wink:

    Wcześniej 10 rano mi nie pomagała a myslalem, że zajmie mi to mac 15min...
  • #15 11305623
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    gaskoin napisał:
    Zmienną przed użyciem należy zadeklarować, to nie jest smalltalk.


    Są zadeklarowane, nie wklejam całego kodu tylko fragment.
  • #16 11305626
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    W szczególności hPort jest zadeklarowany :)
  • #17 11305627
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Fakt, efekt godziny.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Co i tak nic nie dalo, ale kolega ma 2 posty wiecej :|
    C:\C++\UART\main.cpp||In function 'void ReadUART(void*)':|
    C:\C++\UART\main.cpp|19|error: invalid conversion from 'int' to 'void*'|
    C:\C++\UART\main.cpp|19|error:   initializing argument 7 of 'void* CreateFileA(const CHAR*, DWORD, DWORD, _SECURITY_ATTRIBUTES*, DWORD, DWORD, void*)'|
    C:\C++\UART\main.cpp|20|error: cannot convert 'bool' to 'void*' for argument '1' to 'BOOL ReadFile(void*, void*, DWORD, DWORD*, _OVERLAPPED*)'|
    C:\C++\UART\Uart.h||In function 'int main()':|
    C:\C++\UART\Uart.h|6|error: too few arguments to function 'bool SetupUart(const char*, int, int, int, int)'|
    C:\C++\UART\main.cpp|29|error: at this point in file|
    C:\C++\UART\main.cpp|41|warning: unused variable 'hThread'|
    ||=== Build finished: 5 errors, 1 warnings ===|
    


    [EDIT]Dodałem paramtery


    To nie wykonalne... nie da sie tego obsłużyć. Jak bym nie robił to różnicą jest tylko ilosc błędów... :|

    [EDIT2]
    Miło, że sie nade mną znęcacie lakoicznymi wypowiedziami z których nic nie wynika, jak przestane odpisywać, tzn że monitor nie wytrzymał 15h mojego stresu.
  • #18 11306130
    digger123
    Poziom 16  
    Posty: 330
    Pomógł: 11
    Ocena: 49
    stwórz nowy wątek

    Link

    tam wrzuć co chcesz i już
  • #19 11306232
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    digger istnieje drobna różnica pomiędzy c++ a c#... Równie dobrze mogłeś rzucić przykładem w Javie.

    Cytat:
    Miło, że sie nade mną znęcacie lakoicznymi wypowiedziami z których nic nie wynika, jak przestane odpisywać, tzn że monitor nie wytrzymał 15h mojego stresu.


    Nikt się nad Tobą nie znęca. Cały czas Ci piszemy jak to zrobić, ale ewidentnie tego nie czytasz. Wszystkie błędy kompilatora masz napisane czego dotyczą, a Ty się zastanawiasz co tu zrobić.

    Dałem Ci linka do CreateFile, nigdzie w nim nie widzę, żeby zwracał boola a Ty jakimś magicznym cudem wpisujesz go do boola.

    Następny błąd kompilatora jest taki, że ReadFile jako pierwszy parametr przyjmuje wskaźnik na void* a ty tam nie dość, że nie wkładasz wskaźnika to jeszcze przekazujesz ten nieszczęsny bool. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

    To co masz zrobić to utworzyć wątek http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx . Wątek ten w pętli ma czytać port funkcją ReadFile i wywoływać delegata jeśli pojawią się dane do odczytu. Słabo waść coś używasz tych googli, wystarczy wpisać nazwę funkcji.

    To co napisałem znajduje się w całym tym temacie, więc jeśli chcesz pomocy to wykaż trochę inicjatywy i przeczytaj wypowiedzi i linki, które tu się do Ciebie wysyła bo nikt Ci tego kodu nie napisze.
  • #20 11328854
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Przeanalizowałem wypowiedzi i piszę program od nowa. Użyłem innej instrukcji do stworzenia wątku i ładnie dziala. Zanim doszedłem do obsługi UARTa natrafiłem na problem ze stworzeniem sekcji krytycznej:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kompilator wywala w drugiej linijce taki błąd:
    expected constructor, destructor, or type conversion before '(' token
  • #21 11328913
    stanleysts
    Poziom 27  
    Posty: 838
    Pomógł: 115
    Ocena: 2
    Jesteś pewien, że błąd tyczy się drugiej linijki? Tu wszystko wygląda OK.
  • #22 11328934
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    WinAPI jak dostać przerwanie gdy przychodzą dane na RS232

    Oto dowód :-)
  • Pomocny post
    #23 11328937
    stanleysts
    Poziom 27  
    Posty: 838
    Pomógł: 115
    Ocena: 2
    Gdzie ty tą funkcje chcesz wywołać...
  • REKLAMA
  • #24 11328944
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Nie rozumiem?

    To nie chat... Tu sie odpowiada pełnymi zdaniami

    [EDIT]
    Mimo wszystko zrozumiałem - trzeba to wrzucić do int main

    Dodano po 24 [minuty]:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Skąd się biora czasem takie dziwne błędy?

    c:\C++\2.0\UART.cpp||In function 'DWORD Odbieranie(void*)':|
    c:\C++\2.0\UART.cpp|25|error: expected 'while' before '(' token|
    c:\C++\2.0\UART.cpp|25|error: expected ';' before 'cout'|
    ||=== Build finished: 2 errors, 0 warnings ===|
    



    Przecież linia 25 to linia z warunkiem if :|
  • #25 11329079
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Dziwne błędy biorą się z dziwnej konstrukcji.

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #26 11329810
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Ale co w tym jest dziwnego?
  • Pomocny post
    #27 11329841
    stanleysts
    Poziom 27  
    Posty: 838
    Pomógł: 115
    Ocena: 2
    to, że nie masz nawiasów po "do"?
  • #28 11329874
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Faktycznie usunąłem je przez przypadek, dzięki

    Dodano po 4 [godziny] 55 [minuty]:

    No i napisałem programik i bez problemu inicjuje UARTa i wysyła ładnie dane, ale nie chce nic odbierać :-( Mimo, że wcześniej instrukcja ReadFile mi działała w innym programie i ją tylko przekopiowałem... Oto cały kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [godziny] 41 [minuty]:

    To jak nie wiecie koledzy co jest źle to może mi podrzucicie lepszy sposób na odczytywanie z portu, bo tutaj program jest w pętli co powoduje 100% obciązenia dla procesora :/

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na odbieranie danych z portu szeregowego RS232 w języku C++, z wykorzystaniem funkcji ReadFile. Zastanawia się, jak zrealizować mechanizm podobny do przerwań w mikrokontrolerach, aby program mógł reagować na przychodzące dane. W odpowiedziach podano, że długość bufora (len) jest jedynie rozmiarem, a nie rzeczywistą ilością danych. Sugerowano utworzenie oddzielnego wątku do obsługi portu COM oraz rejestrację zdarzeń. Użytkownik napotkał problemy z kompilacją kodu, w tym błędy związane z deklaracją zmiennych i nieprawidłowym użyciem funkcji CreateFile. W końcu, po wielu próbach, udało mu się zainicjować UART, ale nadal miał trudności z odbieraniem danych.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA