eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDo tych co tu piszą w C++ Re: Do tych co tu piszą w C++
  • Data: 2012-01-25 13:47:11
    Temat: Re: Do tych co tu piszą w C++
    Od: Waldemar Krzok <w...@z...fu-berlin.de> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Am 25.01.2012 14:15, schrieb 4CX250:
    > W C++ piszę taki mały programik do odczytywania pomiarów z miernika RLC.
    >
    > Wszystko w WinApi.
    >
    > Najpierw muszę to urządzenie zainicjować i robię to tak:
    >
    > strcpy ( Buffer_write, "//\x1B""2\x0A" ); // polecenie ESC2 - przejście
    > urządzenia w tryb REMOTE
    > WriteFile( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
    >
    > strcpy ( Buffer_write, "*CLS;ese 255\x0A" ); // Wyzerowanie urządzenia
    > WriteFile ( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
    >
    > Następnie chcę sprawdzić czy komunikacja z urządzeniem jest prawidłowa.
    > Robię to pytaniem o identyfikator urządzenia.
    >
    > strcpy ( Buffer_write, "*idn?\x0A" ); // Niech się urządzenie teraz
    > przedstawi
    > WriteFile ( hPort, Buffer_write, strlen ( Buffer_write ), &ile, 0 );
    >
    >
    > W następnej części programu mam problem. Nie bardzo wiem, co zrobić aby
    > program odczekał skutecznie tylko tyle czasu ile jest niezbędne, aż w
    > buforze odbiorczym COM pojawią się wszystkie dane wysłane przez urządzenie.
    >
    > Narazie robię to w bardzo nieelegancki sposób za pomocą opóźnienia
    >
    > Sleep (1000);
    >
    > Jest coś skuteczniejszego?
    >
    > Dalej w programie jest tak.
    > Po odczekaniu 1000ms program przystępuje do odczytania bufora.
    > Najpierw sprawdzam ile jest znaków w buforze COM do odczytania
    >
    > Result = ClearCommError( hPort, &Errors, &ComStatus );
    > Buffer_lenght = ComStatus.cbInQue; // Sprawdzenie ile bajtów oczekuje w
    > buforze wejściowym COM
    >
    > Następnie czyszczę bufor odbiorczy ale nie wiem czy to jest właściwy
    > sposób.
    > Gdy tego nie robiłem to były w nuforze śmieci z poprzednich odczytów
    >
    > strcpy(Buffer_read, " "); // Wyzerowanie bufora odbiorczego
    >
    > Ostatecznie odczutuję zawartośc bufora
    >
    > Result = ReadFile( hPort, Buffer_read, Buffer_lenght, &ile, NULL );
    >
    > Wynik trafia do okienka na ekranie
    >
    > SetWindowText( g_hText1, Buffer_read );
    >
    > Pominąłem polecenia if oraz while które pilnują aby nie próbować czekać
    > w nieskończoność aż coś się pojawi w buforze.
    > W analogiczny sposób odpytuję urządzenie o wyniki konkretnych pomiarów
    > wartości RLC i tam też mam taki sam problem.

    Po pierwsze możesz sobie zdefiniować stringi i posługiwać się nazwami,
    ale to kwestia smaku. Ja tak lubię ;-).
    Po drugie: nie wiem, czy twój miernik zwraca zero delimited string.
    Jeżeli były śmieci, to prawdopodobnie nie masz końcowego zera w stringu.
    Musisz je dopisać na końcu Buffer_read po ReadFile:
    Buffer_read[ile] = 0x00;
    Wtedy nie musisz zerować bufora. Warto sprawdzić, czy "ile" nie
    przekracza długości bufora. Buffer overflow jest nieprzyjemnym
    zjawiskiem i może doprowadzić do chroniczniej kurwicy gonad ;-). W
    szczególności na początku, jak miernik coś wysyła, a program jeszcze nie
    odbiera może się conieco uzbierać. Flush też by się przydał.

    Co do sleep, to obejść możesz to właściwie tylko przez napisanie obsługi
    przerwania. Dawno nie pisałem programu pod COMa, ale chyba istnieje
    metoda klasy COMM, czy jak się ona tam nazywała, definiująca przerwanie.
    Zamiast sleep możesz dać polling na ComStatus.cbInQue, choć powinna być
    też metoda dająca wynik true, jak cokolwiek przyszło. Osobiście robię te
    rzeczy na ogół przez polling, a timer załatwia sprawę, jak coś wisi.
    Timeout też jest na ogół metodą przy COMM.

    Waldek


    --
    My jsme Borgové. Sklopte štíty a vzdejte se. Odpor je marný.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: