-
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ý.
Następne wpisy z tego wątku
- 25.01.12 16:10 Sebastian Biały
- 25.01.12 19:37 4CX250
- 25.01.12 19:40 Grzegorz Niemirowski
- 25.01.12 19:42 4CX250
- 25.01.12 19:48 Sebastian Biały
- 25.01.12 19:51 4CX250
- 25.01.12 19:57 4CX250
- 25.01.12 20:06 v...@i...pl
- 25.01.12 20:09 Sebastian Biały
- 25.01.12 20:23 Waldemar Krzok
- 25.01.12 21:04 Sebastian Biały
- 25.01.12 21:13 Michoo
- 26.01.12 07:09 Zbych
- 26.01.12 09:31 a...@p...fm
- 26.01.12 18:25 Robert Zemła
Najnowsze wątki z tej grupy
- Rejestrator temperatur - termopara, siec
- Router LTE z możliwością zmian MTU
- Fajny film widziałem...
- Jaka ładowarka sieciowa do Iphona?
- Taśma izolacyjna do prac elektrycznych
- Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Wkrętarki, wiertarki...
- Zasilacz impulsowy 12V 10A, coś godnego uwagi jako zamiennik akumulatora wkrętarki
- Mouser - koszt wysyłki
- [OT] Jak wycinac ksztalt w piance lub styropianie?
- FV--> ciepła woda w kranie
- Szok
Najnowsze wątki
- 2025-07-14 Awaria VM?
- 2025-07-14 Gdańsk => Programista Kotlin <=
- 2025-07-14 Warszawa => Junior Rekruter <=
- 2025-07-14 Warszawa => Specjalista rekrutacji IT <=
- 2025-07-14 Wkłady do zniczy...
- 2025-07-14 Warszawa => Specjalista ds. Sprzętu Komputerowego <=
- 2025-07-14 Re: PO chroniło i chroni policyjnych bandziorów [zawiasy za katowanie obywatela (Poznań czerwiec 2012)]
- 2025-07-14 Warszawa => International Freight Forwarder <=
- 2025-07-14 Warszawa => Recruiter 360 <=
- 2025-07-14 Re: Rz?Âd ZAKAZUJE magazyn?Â?w energii ?!! Nowe prawo od 14 lipca to SZOK! ??Â
- 2025-07-14 Warszawa => Sales Assistant <=
- 2025-07-13 Fałszywe alerty
- 2025-07-12 dlaczego gadacie z tym debilem
- 2025-07-13 Unia Europejska przygotowuje nowy podatek
- 2025-07-13 Unia Europejska przygotowuje nowy podatek