-
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
- Opis produktu z Aliexpress
- No proszę, a śmialiście się z hindusów.
- Zewnętrzne napięcie referencyjne LM385 1,2V -> 100mV dla ICL7106, Metex M-3800
- karta parkingowa
- Wl/Wyl (On/Off) bialy/niebieski
- I3C
- Pytanie o transformator do dzwonka
- międzymordzie USB 3.2 jako 2.0
- elektronicy powinni pomysleć o karierze elektryka
- jak szybko plynie prad
- Płytki Milkv-Duo
- Światłowód między budynkami
- POtrzebny bufor 3.3<>5V, jedonkieruowy, trójstanowy, wąski
- retro
- Bezprzewodowe polączenie Windows z projektorem
Najnowsze wątki
- 2024-11-17 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- 2024-11-18 Gdynia => Spedytor Międzynarodowy <=
- 2024-11-18 Białystok => Full Stack web developer (obszar .Net Core, Angular6+) <
- 2024-11-18 Białystok => Programista Full Stack (.Net Core) <=
- 2024-11-18 Kraków => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2024-11-18 Kraków => Business Development Manager - Network and Network Security
- 2024-11-18 Kraków => Network Systems Administrator (IT Expert) <=
- 2024-11-18 Kraków => Administrator Systemów Sieciowych (Ekspert IT) <=
- 2024-11-18 Zdunowo => Senior PHP Symfony Developer <=
- 2024-11-18 Łódź => QA Inżynier <=
- 2024-11-18 Lublin => Senior PHP Developer <=
- 2024-11-18 Gliwice => Specjalista ds. public relations <=
- 2024-11-18 Gdynia => Front-End Developer (React/Three.js) <=
- 2024-11-18 Gdańsk => Specjalista ds. Sprzedaży <=
- 2024-11-18 Gdańsk => Kierownik Działu Spedycji Międzynarodowej <=