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++] RS232 - Odbieranie i interpretacja ramki w postaci binarnej.

Arkain 09 Lut 2012 10:58 9885 69
Najlepsze odpowiedzi

Jak w C++ wyłuskać dane binarnej ramki RS232 z bufora do zmiennych lub struktury i odwrotnie zamienić strukturę na bajty?

Najprościej zdefiniować strukturę odpowiadającą zawartości pola DANE i czytać bajty bezpośrednio do niej albo rzutować bufor na wskaźnik do tej struktury, zamiast ręcznie wyciągać wszystko z vectora [#10518468][#10518849][#10519156][#10523015] Jeśli różne funkcje niosą różne typy danych, zrób osobne struktury dla różnych ramek, a w razie potrzeby oprzyj je o wspólną strukturę bazową [#10521538] Do pól struktury wygodniej sięgać przez `->`, a jeśli masz sam obiekt, przez `.`; dla elementów tablicy używaj `[]` [#10545086] Jeśli ramka ma stały rozmiar, vector nie jest konieczny — wystarczy zwykła tablica lub bezpośrednie kopiowanie do struktury, byle pilnować zgodności rozmiaru danych [#10523015][#10524523]
Wygenerowane przez model językowy.
REKLAMA
  • #61 10953183
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Arkain napisał:
    hmm a jak sprawdzić to jaka zmienna jest pod tym adresem?
    Np. w Locals. Przykład z VS:
    [C++] RS232 - Odbieranie i interpretacja ramki w postaci binarnej.
  • REKLAMA
  • #62 10953684
    Arkain
    Poziom 11  
    Posty: 55
    Ocena: 2
    Niestety gdy sprawdzam w Local Variables ów adres to niema tam żadnych zmiennych :/

    Mam pytanie. Skoro GUI ma być obsługiwane TYLKO w głównym wątku to jeżeli mam kolejkę STL i w wątku dodaję do niej kolejne elementy a w głównym wątku sprawdzam rozmiar by wpisać go do pola edit to muszę w obu wątkach te części kodu objąć sesją krytyczną? i w głównym wątku jak cyklicznie i szybko odczytywać tą wartość? Zrobić timer? Czy jest inne miejsce które się stosuje do takich sztuczek? Szukam i szukam i nigdzie nie widzę jak pogodzić GUI i wątki (w języku PL)...

    Proszę o pomoc tych którzy uporali się z podobnym problemem (wyświetlanie wyników pracy wątku w kontrolkach których właścicielem jest główny wątek) o wyjaśnienie mi jak to powinno się robić...
  • #63 10957106
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Arkain napisał:
    Skoro GUI ma być obsługiwane TYLKO w głównym wątku to jeżeli mam kolejkę STL i w wątku dodaję do niej kolejne elementy a w głównym wątku sprawdzam rozmiar by wpisać go do pola edit to muszę w obu wątkach te części kodu objąć sesją krytyczną?
    Myślę, że powinno działać bez sekcji krytycznej. Chociaż gwarancji nie ma.

    Arkain napisał:
    i w głównym wątku jak cyklicznie i szybko odczytywać tą wartość? Zrobić timer?
    Częstotliwość timera najlepiej dobrać empirycznie - kilka razy na sekundę. W załączniku programik - demo. Zmienna (typu short bez znaku) jest zwiększana o 1 co 10ms.

    Arkain napisał:
    Czy jest inne miejsce które się stosuje do takich sztuczek? Szukam i szukam i nigdzie nie widzę jak pogodzić GUI i wątki (w języku PL)...
    Inne miejsce?
    Załączniki:
    • WindowsFormsApplication1.exe (9 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #64 10957148
    Arkain
    Poziom 11  
    Posty: 55
    Ocena: 2
    Hmmm

    Inne miejsce to znaczy w tej chwili wszystkie zmienne i stałe globalne oraz wątki i timery zawarte są w pliku źródłowym głównego okna. To chyba nie jest zbyt dobra praktyka prawda?

    Dzięki za demo. Czyli co liczba zwiększana jest o 1 w wątku podrzędnym a w wątku głównym wyświetlana poprzez Timer? Czemu Menadżer Zadań w Windows 7 pokazuje że ten program ma 7 wątków?
  • REKLAMA
  • #65 10957591
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Arkain napisał:
    Inne miejsce to znaczy w tej chwili wszystkie zmienne i stałe globalne oraz wątki i timery zawarte są w pliku źródłowym głównego okna. To chyba nie jest zbyt dobra praktyka prawda?
    To zależy. Timer jest tutaj elementem potrzebnym do odświeżania elementu okna, więc czemu miałby być gdzieś indziej? Natomiast do obsługi transmisji przez port COM lepiej wrzucić do osobnego pliku. Dane możesz przekazać wątkowi przy jego uruchamianiu, co pozwoli uniknąć zmiennych globalnych.

    Arkain napisał:
    Dzięki za demo. Czyli co liczba zwiększana jest o 1 w wątku podrzędnym a w wątku głównym wyświetlana poprzez Timer?
    Program napisałem w C# ;) i ta liczba jest zwiększana przez System.Timers.Timer. Choć tutaj to nie ma znaczenia.

    Arkain napisał:
    Czemu Menadżer Zadań w Windows 7 pokazuje że ten program ma 7 wątków?
    Uroki środowiska .NET. ;)

    Dodano po 3 [minuty]:

    Nieco zmieniłem post wyżej.
  • #66 10959879
    Arkain
    Poziom 11  
    Posty: 55
    Ocena: 2
    Hmmm zaczyna mi się sesja i chyba projekt zostanie odstawiony co najmniej do 16.06...

    A czy oprócz timera jest jeszcze w głównym wątku miejsce gdzie można coś wykonywać w kółko (pewnie pętla komunikatów)? Chodzi mi o takie miejsce jak funkcja wątku pobocznego czy jest takie miejsce w jak funkcja wątku głównego?
  • REKLAMA
  • #67 10960617
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Arkain napisał:
    A czy oprócz timera jest jeszcze w głównym wątku miejsce gdzie można coś wykonywać w kółko (pewnie pętla komunikatów)?
    Można oczywiście "bawić się" w pętli komunikatów funkcją PeekMessage by GetMessage nie blokowało wątku głównego.

    Arkain napisał:
    Chodzi mi o takie miejsce jak funkcja wątku pobocznego czy jest takie miejsce w jak funkcja wątku głównego?
    Jest - main.
  • #68 11025322
    Arkain
    Poziom 11  
    Posty: 55
    Ocena: 2
    Już praktycznie po sesji ;]

    Z powodu iż muszę program ukończyć na dniach to jednak jego działanie obecnie będzie oparte na timerach bo w wielowątkowości jest wiele ważnych aspektów o których jeszcze nic nie wiem (strefy bezpieczeństwa itp).

    Pytanie tylko czy jeżeli program oparty jest o timery to mogę "jednocześnie" zapisywać do początku kolejki dane a z końca je odczytywać i usuwać?
    (bo i tak nigdy nie dzieje się to w jednym czasie bo to program jedno wątkowy zgadza się?)
  • #69 11030642
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Tak, to jest jeden wątek. Można się o tym przekonać, gdy procedura timera zabiera dużo czasu - okno się przywiesi.
  • #70 11033456
    Arkain
    Poziom 11  
    Posty: 55
    Ocena: 2
    Staram się rozwiązać taki problem:

    Wątek główny - czyli okna programu
    Ma pola edit (np wyświetlające napięcie)
    TCHart - wykres w/w napiecia

    Wątek 1: odbierający dane z RS232 (znak po znaku i oczekuje na znak więc może się przywieszać) i wkładający je do kolejki.

    Wątek 2: analizujący dane z kolejki i wypełniający edit i TChart w głównym oknie

    Wątek 3: Sczytywanie danych z innych pól edit w głównym oknie i wysyłanie ich przez RS232 <- jednak to może być chyba realizowane w głównym oknie?

    Jak to wszystko pogodzić? Program pisany w Borland C++ a komunikacja oparta o WinAPI.

    Podobno nie powinno się odwoływać z innego wątku do kontrolki w głównym oknie... To jak ja mam uzupełniać te pola a jeszcze bardziej wykres na którym zależy mi najbardziej (na najmniejszym opóźnieniu między pomiarem a wyświetleniem danych.)

    Proszę o przykład rozwiązania tego trudnego problemu.

    Z góry serdeczne dzięki za pomoc.
    (Ten wątek stał się pewną skarbnicą wiedzy na temat komunikacji RS-232 i gdyby znaleźć najlepsze rozwiązanie komunikacji opartej o wątki to wątek stałby się bezcenny ;P)

Podsumowanie tematu

✨ W dyskusji poruszono temat odbierania i interpretacji ramki danych w formacie binarnym przy użyciu języka C++ oraz WinAPI do komunikacji przez port RS232. Użytkownik opisał strukturę ramki, która zawiera bajty startowe, adresowe, funkcjonalne, dane, CRC oraz bajt stopu. W odpowiedziach zaproponowano użycie struktur do przechowywania danych zamiast wektorów, co ułatwia manipulację danymi. Użytkownicy podzielili się doświadczeniami związanymi z obsługą portów COM, problemami z dynamicznymi tablicami oraz synchronizacją wątków. Zasugerowano, aby GUI było obsługiwane w głównym wątku, a operacje na danych w osobnych wątkach, co pozwala na uniknięcie zacięć interfejsu. Wskazano również na konieczność stosowania sekcji krytycznych przy dostępie do wspólnych zasobów wątków.
Wygenerowane przez model językowy.
REKLAMA