Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C i RS232 - Komunikacja z urządzeniem przez RS232

martkotek 23 Sty 2014 14:58 2979 7
  • #1 23 Sty 2014 14:58
    martkotek
    Poziom 9  

    Koledzy,
    mam duży problem. Potrzebuję napisać programik, który połączy się z urządzeniem (wagą) przez port rs232, wyśle do niej zapytanie i uzyska odpowiedź, którą zapisze do pliku .txt.

    Napisałem na podstawie różnych źródeł taki o to programik, jednak ten (według programów podsłuchujących komunikację po rs232) łączy się, wysyła komendę jednak nie otrzymuje nic z powrtotem. Ma ktoś jakiś pomysł co jest źle?

    Dodam tylko, że według logów mój program ma taką konfigurację łącza:
    Port COM jest otwarty
    <20140123135600.416 SYS>
    Szybkość transmisji 9600
    <20140123135600.416 SYS>
    Wyłączono sygnał RTS
    <20140123135600.416 SYS>
    Sygnał DTR włączony
    <20140123135600.416 SYS>
    Bity danych=8, Bity stopu=1, Parzystość=None
    <20140123135600.416 SYS>
    Ustawione znaki: Eof=0x1A, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
    <20140123135600.416 SYS>
    Ustawienia kontroli przepływu danych: SterowaniePrzepływemDanych=(DTR_CONTROL), FlowReplace=(), Limit Xon=256, Limit Xoff=256
    <20140123135600.518 TX>

    a oryginalny komunikujący sie z wagą taką:
    <20140123102221.078 TX>
    01#TG#
    <20140123102221.109 SYS>
    Port COM jest zamknięty
    <20140123102311.546 SYS>
    Port COM jest otwarty
    <20140123102311.546 SYS>
    Rozmiar kolejki wejścia/wyjścia 1024/512
    <20140123102311.546 SYS>
    Wyczyszczono port szeregowy: RXABORT, RXCLEAR, TXABORT, TXCLEAR
    <20140123102311.546 SYS>
    Czasy oczekiwania: PrzedziałCzytania = -1. MnożnikCałkowitegoCzasuCzytania=0, StałaCałkowitegoCzasuCzytania=0, MnożnikCałkowitegoCzasuZapisu=0, StałaCałkowitegoCzasuCzytania=5000
    <20140123102311.546 SYS>
    Szybkość transmisji 9600
    <20140123102311.546 SYS>
    Wyłączono sygnał RTS
    <20140123102311.546 SYS>
    Sygnał DTR włączony
    <20140123102311.546 SYS>
    Bity danych=8, Bity stopu=1, Parzystość=None
    <20140123102311.546 SYS>
    Ustawione znaki: Eof=0x1A, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
    <20140123102311.546 SYS>
    Ustawienia kontroli przepływu danych: SterowaniePrzepływemDanych=(DTR_CONTROL), FlowReplace=(), Limit Xon=256, Limit Xoff=256

    Poniżej mój program:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Będę wszystkim bardzo wdzięczny za wszelkie sugestie i wskazówki

    0 7
  • #2 23 Sty 2014 15:51
    Sparrowhawk
    Poziom 21  

    Witaj. Na przyszłość kod zamieść np w

    Kod: c
    Zaloguj się, aby zobaczyć kod
    .

    Problemów może być kilka. Przede wszystkim twój program nie czeka na odpowiedź z wagi. Wysyłasz do niej komendę i od razu oczekujesz odpowiedzi. Funkcja ReadFile nie dostaje żadnych danych i następuje zamknięcie programu.

    0
  • #3 23 Sty 2014 16:53
    cepelia
    Poziom 20  

    zobacz jakikolwiek terminal jak jest napisany, głównie problemem pozostaje ustawienie prawidłowych parametrów portu, a potem czeka się tylko na dane z portu i po wszystkim...

    0
  • #4 23 Sty 2014 17:35
    martkotek
    Poziom 9  

    Ok, trochę się posunąłem z problemem. Pierwszy problem był w komendzie wysyłanej do wagi. Zgubiły mi się znaczki przy kodowaniu z hexa.

    Piszecie, że program nie czeka na odpowiedź z wagi. Jak to zaimplementować? Zapewne zaraz po komendzie odczytu, ale jak? Przyznam się, że nie jestem w temacie zaawansowany, a to co napisałem, napisałem na podstawie różnych książek i skryptów...

    Z góry dzięki za pomoc

    Obecnie kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #5 23 Sty 2014 23:34
    Sparrowhawk
    Poziom 21  

    Jeżeli wiesz, że odpowiedź z wagi będzie miała faktycznie długość 10 bajtów, to najprościej można to zrobić tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po co zmienne globalne deklarujesz jako static? Dlaczego do lpBuffor_read wczytujesz 10 znaków, a następnie do pliku próbujesz zapisać dane od 13 do 16 bajtu?

    Ta "funkcja":
    Kod: c
    Zaloguj się, aby zobaczyć kod

    wpisze do pliku same zera. I w ogóle to powyższe (Dokładnie blok if else) jest bez sensu. Wynika z tego tyle: Jak "i" jest równe 14 to zrób to, a jak nie, to zrób to samo.

    Ogólnie obsługa komunikacji z portu COM w Windows w C++ nie jest taka łatwa jak się wydaje. Najlepiej to zrobić z wykorzystaniem zdarzeń i wątków.

    O prostej obsłudze można poczytać tu:
    Windows Serial Port Programming

    A o obsłudze z wykorzystaniem wątków tutaj:
    Serial Communication in Windows

    0
  • #6 23 Sty 2014 23:43
    martkotek
    Poziom 9  

    mój błąd... odpowiedź z wagi będzie znacznie dłuższa... ale już wiem, że musze tam tą 10tkę zmienić na prawidłową wartość.

    If`y mają sens bo nie są takie same. Pierwszy ma przecinek bo własnie po 13stym znaku muszę mieć separator dziesiętny...

    Spróbuję zrobić tak, jak napisałeś. Dzięki!

    0
  • #7 24 Sty 2014 11:25
    martkotek
    Poziom 9  

    No to znowu niestety mam problem...
    Zrobiłem tak jak kolega radził, kod programu poniżej.
    Efekt taki, że program się zapętla i nie chce wyjść z pętli.

    Ciąg znaków zwracany przez wagę w systemie HEX jest następujący:
    02303123544723202020302E303023202020302E303023202020302E303023383823032F
    Ustawiłem więc RS_ile i liczbę bitów do odczytu na 36, według monitora portu COM waga zwraca całą odpowiedź i już nic nie nadaje, a program dalej zczytuje. Mało tego, jeżeli to pętli dorzuciłem wyświetlanie aktualnej wartości RS_ile, wskazuje ono, że ciągle ma wartość 0, więc to by było powodem, przez który program wisi w pętli. Jednak czemu wartość RS_ile nie rośnie, skoro na monitorze COM widać że znaki już zostały przez wagę wysłane. ??


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 24 Sty 2014 12:03
    Sparrowhawk
    Poziom 21  

    W takim razie po odpowiedzi z wagi (Jeszcze w pętli) sprawdź co zawiera lpBuffor_read.

    0
  Szukaj w 5mln produktów