-
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
- Dzisiaj Bentlejem czyli przybieżeli sześciu Króli do Rysia na kasie
- ciekawy układ magnetofonu
- Mikroskop 3D
- Jak być bezpiecznym z Li-Ion?
- Szukam monitora HDMI ok. 4"
- Obcinaczki z łapaczem
- termostat do lodowki
- SEP 1 kV E
- Aku LiPo źródło dostaw - ktoś poleci ?
- starość nie radość
- Ataki hakerskie
- Akumulatorki Ni-MH AA i AAA Green Cell
- Dławik CM
- JDG i utylizacja sprzetu
- Identyfikacja układ SO8 w sterowniku migających światełek choinkowych
Najnowsze wątki
- 2024-12-25 Kraków => Full Stack .Net Engineer <=
- 2024-12-25 Kraków => Programista Full Stack .Net <=
- 2024-12-25 Bieruń => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-12-25 Białystok => Inżynier Serwisu Sprzętu Medycznego <=
- 2024-12-25 Białystok => Delphi Programmer <=
- 2024-12-25 Chrzanów => Team Lead / Tribe Lead FrontEnd <=
- 2024-12-25 Kraków => Ekspert IT (obszar systemów sieciowych) <=
- 2024-12-25 Mińsk Mazowiecki => Spedytor Międzynarodowy <=
- 2024-12-24 Dzisiaj Bentlejem czyli przybieżeli sześciu Króli do Rysia na kasie
- 2024-12-23 Przedłużacz USB-C działa w połowie
- 2024-12-24 Cicha noc...
- 2024-12-24 Gdańsk => Software .Net Developer <=
- 2024-12-23 Opole => Konsultant wdrożeniowy Comarch XL/Optima (Księgowość i Ka
- 2024-12-23 Łódź => Architekt rozwiązań (doświadczenie w obszarze Java, AWS)
- 2024-12-23 Kraków => System Architect (Java background) <=