Komunikacja po RS232 i TComPort 2.64

Feb 08, 2007 3 Replies

Witam Szanownych Czytelnikow. Mam pewien problem z komponentem do obslugi portow szeregowych COM. Program napisany jest w C++ Builder 5. Aplikacja komunikuje sie z urzadzeniem ktore na zapytanie odpowiada okreslona ramka. Odpowiedz otrzymuje max po 600ms od wyslania ramki z zapytaniem ( plus dodatkowo czas potrzebny na transmisje ramki okolo 320ms( transmisja: 19200



8N1 - spodziewam sie odebrac 611 bajtow stad te dodatkowe 320ms). Ca³y problem w tym ¿e po up³ywie jednej sekundy i odczytaniu ramki z bufora odbiorczego funkcja ComPort1->ReadStr(ramka,rozmiar_bufora); w zmiennej "ramka" znajduje sie tylko czesc odebranych danych. Brakuj±ca czesc znakow znajduje sie jak podejrzewam w jakim dodatkowym buforze poniewaz po uplywie kilkuset milisekund i ponownym odczytaniu odbieram pozostala czesc brakujacych danych. Uzywalem funkcji Win Api FlushFileBuffers aby oproznic bufor:

FlushFileBuffers((void*)(ComPort1->Handle));



ale to niestety nic nie pomoglo. Jezeli ktos ma jakies sugestie bardzo chetnie wyslucham. Dziekuje za wszelka pomoc;



U¿ytkownik "roxy" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:eqfuc8$afd$ snipped-for-privacy@news.onet.pl...

W zdarzeniu procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var z:string; i:integer; begin z:=''; comport1.Readstr(z,count); for i:=0 to count-1 do begin inbuff[ls]:=w; // odebrany bajt do tablicy inc(ls); if ls= 611 then begin ls:=0; ustawienie inforaacji o kompletnej ramce etc end; end; end;

To jest mniej wiecej tak ze sysemowy sterownik odebiera jakas porcje danych i ja buforuje generujac jednoczesnie komunikaty do aplikacji ze cos jest w buforze UARTu wysylajac to cos i ilosc bajow tego czegos. Potem kasuje bufor i znowu cos tam zbiera i znowu to wysyla jesli aplikacja odebrala to co wyslal poprzednio. I tak w kolko puki jest cos do odebrania. W idealnych warunkach powinien to byc w zasadzie jeden bajt ale jak system jest zajety to idzie srednio po kilka bajtow. dlatego powinienes stosowac funkcje ReadStr w zdarzeniu onRxChar starajac sie na bierzaco odebierac wysylane bajty inaczej nigdy nie wiesz ile czego jest w buforze. Co prawda TcomPort ma zaimplementowane rozne rozwiazania do kompletowania bufora ale nigdy ich nie analizowalem ani nie stosowalem. Ten sposob odczytu ktory podalem stosuje od lat i nie mam zadnych problemow (mam jeszcze identyfikacje bajtow startowych i kasowanie indeksu LS jesli konstrukcja ramki sie nie zgadza i przepisywanie kompletnego buforu z inbuff do buff po odebraniu okreslonej ilosci znakow. Mysle ze bez problemu przetlumaczysz sobie przyklad z pascala na C

podrawiam wojtek

formatting link
CMMS Maszyna Golem OEE Produkt - Baza Wiedzy

Sprawdz jak masz ustawione Buffe -> InputSize i ew. zwiêksz jego rozmiar (prawdopodobnie masz ustawione: 512 ).

Mk.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required