Com port læsning

Tags:    delphi

Hvordan aflæser jeg data fra en port, fx. en com. port.
Ikke internet, men andet udstyr.
Jeg vil gerne bygge et program der kan det (delphi 6)
Peter



Der findes et væld af komponenter til det, kig evt forbi torry.net



Hej
Jeg bruger Comport Libary fra:
http://sourceforge.net/projects/comport/
Det er nogle få komponenter man installerer i Delphi. Jeg bruger det i Delphi 7, men det virker også til Delphi 6. Det er til kommunikation over den serielle port. Det er til event drevet seriel kommunikation. Dvs. modtagelse af data på seriel porten kører i baggrunden samtidig med, at ens program kan lave andre ting. Det er langt bedre end polling. Jeg bruger det til at kommunikere med microcontrollere fra PC'en. Comport Libary er let at bruge og det er gratis.
MVH
Wilhelm



Hej
Jeg bruger Comport Libary fra:
http://sourceforge.net/projects/comport/
Det er nogle få komponenter man installerer i Delphi. Jeg bruger det i Delphi 7, men det virker også til Delphi 6. Det er til kommunikation over den serielle port. Det er til event drevet seriel kommunikation. Dvs. modtagelse af data på seriel porten kører i baggrunden samtidig med, at ens program kan lave andre ting. Det er langt bedre end polling. Jeg bruger det til at kommunikere med microcontrollere fra PC'en. Comport Libary er let at bruge og det er gratis.
MVH
Wilhelm


Hej Wilhelm

Det var lig hvad jeg søgte, mange tak

Peter



Hej
Jeg bruger Comport Libary fra:
http://sourceforge.net/projects/comport/
Det er nogle få komponenter man installerer i Delphi. Jeg bruger det i Delphi 7, men det virker også til Delphi 6. Det er til kommunikation over den serielle port. Det er til event drevet seriel kommunikation. Dvs. modtagelse af data på seriel porten kører i baggrunden samtidig med, at ens program kan lave andre ting. Det er langt bedre end polling. Jeg bruger det til at kommunikere med microcontrollere fra PC'en. Comport Libary er let at bruge og det er gratis.
MVH
Wilhelm


Hej Wilhelm

Det var lige hvad jeg søgte, mange tak

Peter

OBS. NYT ?
I programmet MiniTerm.dpr som lå under ex. er de data der
bliver vist i memoen, KRYPTISKE. Hvordan omsætter jeg disse
til klartsprog !!
I programmet ComExample, I Terminalen, vises data i klartsprog, men disse kan jeg tilsyneladende ikke arbejde med (overføre til en streng), har du en løsning ?

Peter



Hej
Forfatteren skriver at hans eksempler er gamle og muligvis ikke virker mere, men selve komponenterne virker fint. Jeg ved ikke helt hvad det er du vil lave? Hvad skal du bruge det til? Det må du forklare nærmere.
Jeg bruger de 2 komponenter ComPort og ComDataPacket der er sat ned på formen. Objektet ComPort1 er så linket til ComDataPacket1 objektet, design time. Man skal så på ComPort1 objektet, design time, gøre sig klart hvilken baudrate man kører med, hvor mange data bits der skal bruges, evt. paritet bit og hvor mange stopbits der skal bruges. Dette sætter man en gang i relevante properties på ComPort1 objektet. Desuden skal man definerer en start og slut streng (eller karakter) i ComDataPacket1 objektet's properties. Derved kan datapakker der sendes op til PC'en, meget let aflæses via ComDataPacket1 objektet's OnPacket event handler. Hvis strengen der sendes til PC'en 'PxxxxxxxxxxS' er adskilt af et 'P' (start karakter) og 'S' (stop karakter), og x er streng hextal, modtager man altså direkte givne data pakke i event handleren.
Når jeg sender bruger jeg blot
Fold kodeboks ind/udKode 

Husk ved opstart at åbne porten en gang:
Fold kodeboks ind/udKode 
og når programmet afsluttes lukkes porten med:
Fold kodeboks ind/udKode 

Jeg håber dette hjælper.
MVH
Wilhelm



Indlæg senest redigeret d. 20.03.2006 12:57 af Bruger #9671
Hej
Forfatteren skriver at hans eksempler er gamle og muligvis ikke virker mere, men selve komponenterne virker fint. Jeg ved ikke helt hvad det er du vil lave? Hvad skal du bruge det til? Det må du forklare nærmere.
Jeg bruger de 2 komponenter ComPort og ComDataPacket der er sat ned på formen. Objektet ComPort1 er så linket til ComDataPacket1 objektet, design time. Man skal så på ComPort1 objektet, design time, gøre sig klart hvilken baudrate man kører med, hvor mange data bits der skal bruges, evt. paritet bit og hvor mange stopbits der skal bruges. Dette sætter man en gang i relevante properties på ComPort1 objektet. Desuden skal man definerer en start og slut streng (eller karakter) i ComDataPacket1 objektet's properties. Derved kan datapakker der sendes op til PC'en, meget let aflæses via ComDataPacket1 objektet's OnPacket event handler. Hvis strengen der sendes til PC'en 'PxxxxxxxxxxS' er adskilt af et 'P' (start karakter) og 'S' (stop karakter), modtager man altså direkte givne data pakke i event handleren.
Når jeg sender bruger jeg blot
Fold kodeboks ind/udKode 

Husk ved opstart at åbne porten en gang:
Fold kodeboks ind/udKode 
og når programmet afsluttes lukkes porten med:
Fold kodeboks ind/udKode 

Jeg håber dette hjælper.
MVH
Wilhelm




Hej igen

Jeg er på uprøvet grund, da jeg normalt programere regnskabs
programmer.
Nu har jeg brug for, at læse data fra en analog radar. Som
sagt får fine data i mini terminalen, men dem kan jeg ikke
arbejde vidre med. Jeg har prøvet din ide, men jeg syntes
stadig, at jeg er på usikker grund. Du har vel ikke et
eksempel ?

MVH
Peter



Hej
Du skal have fat i en manual, der beskriver kommunikations protokollen til den Analoge radar. Med protokol mener jeg hvordan data'en er organiseret der sendes op til PC'en. Data afsendes typisk i en frame.
F.eks.: | Adresse | Længde |Data 1 | Data 2 |....|Data n | Checksum |, framen kan sagtens være helt anderledes end vist her. Framen kan have en fast eller variabel længde. Ligeledes såfremt du kan give radaren ordrer, er disse også fastlagt i protokollen.
Det er vigtigt du ved hvornår framen starter og stopper, for at synkronisere modtagelsen af data. Jeg formoder det er ekkoer du modtager fra radaren? Hvis det er det, kunne man antage f.eks., at hvert ekko er beskrevet med et polært koordinat, dvs. en afstand og en vinkel. F.eks. kan afstanden være et 16bit tal og vinklen et 16bit tal, så vil et givent ekko ligge således i framen: ...| afstand HB | afstand LB | vinkel HB | vinkel LB |... . Dvs. afstanden er opbygget af 2 bytes (highbyte + lowbyte), der tilsammen giver et Word. Har du de 2 bytes kan Word'et bestemmes på flg. måde:

Fold kodeboks ind/udKode 


Hvis der nu er en bestemt start streng og slut streng i framen, er det let at opsnappe framen/data-pakken. Så kan du som sagt bruge ComDataPacket komponentet's onPacket event handler. Desuden skal du også klippe bider ud af modtagede streng og derefter videre bearbejde dem.:

Fold kodeboks ind/udKode 


Det kan være de pakker/frames PC'en modtager er lidt kryptiske. F.eks. kun med en startbetingelse og et data felt, der beskriver længden af frame'en. Så skal programmet vente på start bestingelsen, aflæse længden i relevante data felt. Der skal anvendes en global tæller, der tælles op, hver gang der modtages en byte fra framen. Når så den globale tæller er talt op til, den aflæste længde, der blev fundet i længde data feltet, er pakken modtaget. Du bliver måske nødt til, at benytte OnRxChar event handleren på ComPort1 objektet i stedet for.

MVH
Wilhelm





Indlæg senest redigeret d. 20.03.2006 00:48 af Bruger #9671
Hej
Wilhelm

Mange tak for dine foreslag, jeg har i mellemtiden
fået hul på problemet (bruger OnRxChar)og arbejder iøjeblikket med, at isolere de data jeg skal bruge.
Data pakkerne er dog af forskellig længde, da der ikke
bruges faste antal karektere ved fx. kurs og fart (
ikke 080 10 men 80 10 osv.)
Jeg er meget glad for dine foreslag, der giver mig flere
brikker at flytte med.

MVH
Peter




En rettelse!
Det er fint du kan bruge mine forslag. Jeg har dog opdaget, at jeg har lavet en fejl i det sidste eksempel. Programmet er blot compileret, jeg havde ikke noget at teste det på. I data pakken i eksemplet:
| 'P' | Afstand HB | Afstand LB | Vinkel HB | Vinkel LB | 'S' | vil det gå i ged, hvis nu en af data byte'ene antager karakteren 'S'. Så tror programmet jo at data pakken er modtaget, hvilket den ikke er. Derfor har jeg rettet eksemplet og lavet en lang start betingelse og stop betingelse, der ikke kan forveksles med de 4 data bytes.

De microcontrollere jeg bruger, der sender jeg data op til PC'en i form at streng hextal. F.eks. 'FE'. Hextallene indgår ikke i karakterne 'P' og 'S', hvorfor jeg bruger disse som start og stop betingelserne i data pakkerne, derfor virker det med OnPacket event handleren her.

Det lyder godt du nu har fået liv i det.

MVH
Wilhelm




t