Avatar billede mick Nybegynder
08. oktober 2000 - 10:54 Der er 4 kommentarer og
1 løsning

Sortere data fra COM-porten

Jeg læser data fra en GPS som er tilsluttet COM-porten. GPSen sender data i NMEA format. Nogle sekunders output fra GPSen, kan se sådan ud :

---------------
$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,6228.116,N,00611.589,E,084034,A*2B

$PGRMZ,86,f,3*25

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07

$GPRMC,084036,A,6228.116,N,00611.589,E,000.0,360.0,081000,003.0,W*68

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,084036,6228.116,N,00611.589,E,1,09,2.0,26.1,M,44.0,M,,*7F

$GPGSA,A,3,01,04,,13,19,20,22,24,25,27,,,2.6,2.0,3.0*3E

$GPGSV,3,1,11,01,69,110,48,04,58,252,47,06,02,003,00,13,63,198,48*7A

$GPGSV,3,2,11,19,26,158,41,20,33,113,43,22,09,076,33,24,39,301,44*7D

$GPGSV,3,3,11,25,18,037,38,27,07,174,31,30,03,338,00,,,,*42

$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,6228.116,N,00611.589,E,084036,A*29

$PGRMZ,86,f,3*25

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07

$GPRMC,084038,A,6228.116,N,00611.589,E,000.0,360.0,081000,003.0,W*66

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,084038,6228.116,N,00611.589,E,1,09,2.0,26.1,M,44.0,M,,*71

$GPGSA,A,3,01,04,,13,19,20,22,24,25,27,,,2.6,2.0,3.0*3E

$GPGSV,3,1,11,01,69,110,48,04,58,252,47,06,02,003,00,13,63,198,48*7A

$GPGSV,3,2,11,19,26,158,41,20,33,113,43,22,09,076,33,24,39,301,44*7D

$GPGSV,3,3,11,25,18,037,38,27,07,174,31,30,03,338,00,,,,*42

$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,6228.116,N,00611.589,E,084038,A*27

$PGRMZ,86,f,3*25

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07

$GPRMC,084040,A,6228.116,N,00611.589,E,000.0,360.0,081000,003.0,W*69

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,084040,6228.116,N,00611.589,E,1,09,2.0,26.1,M,44.0,M,,*7E

$GPGSA,A,3,01,04,,13,19,20,22,24,25,27,,,2.6,2.0,3.0*3E

$GPGSV,3,1,11,01,69,110,48,04,58,252,47,06,02,003,00,13,63,198,48*7A

$GPGSV,3,2,11,19,26,158,41,20,33,113,43,22,09,076,33,24,39,301,44*7D

$GPGSV,3,3,11,25,18,037,38,27,07,174,31,30,03,338,00,,,,*42

$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,6228.116,N,00611.589,E,084040,A*28

$PGRMZ,86,f,3*25

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07

$GPRMC,084042,A,6228.116,N,00611.589,E,000.0,360.0,081000,003.0,W*6B

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,084042,6228.116,N,00611.589,E,1,09,2.0,26.1,M,44.0,M,,*7C

$GPGSA,A,3,01,04,,13,19,20,22,24,25,2
---------------------

Selve det at læse ind-data fra COM-porten er ikke noget problem. Men nu øsnker jeg at skille ud alle sætninger som begynder med $GPGGA - altså f.eks. denne :

$GPGGA,084040,6228.116,N,00611.589,E,1,09,2.0,26.1,M,44.0,M,,*7E

Hvordan gør jeg dette enkelt?. Jeg har tænkt på at lave en \"kø-struktur\", som læser et tegn af gangen, og herefter ser om de sidste 6 tegn er = $GPGGA. Men der må vel findes en mere elegant metode...
Avatar billede sjensen Nybegynder
08. oktober 2000 - 11:36 #1
Opret en stringlist (slist := TStringlist.create;) og put hver linie ind i den.

Slist.add(tekst);

Herefter kan du søge igennem med for i := 0 to slist.count -1 do
begin
  // test på det du vil f.eks.
  if copy(slist1.items[i],1,6) = \'$GPGGA\' then
  begin
    // gør hvad du vil
  end;
end;

Efterfølgende kan du evt. lægge en linie over i en anden stringlist med slist2.commatext := slist.item[i];

Herved opsplittes den enkelte linie i et antal linier hvor indholdet mellem hvert komma optræder i hver sin linie.

Avatar billede mick Nybegynder
08. oktober 2000 - 11:59 #2
sjensen>> Dette er selvfølgelig en mulighed. Men jeg glemte at fortælle at sorteringen skal ske kontinuerligt. Dvs. GPSen bliver ved med at spytte data ud, og samtidg må programmet sortere ud de rigtige sætninger, og behandle disse.

Det er måske muligt at lægge f.eks. 10 linjer i Stringlisten og så undersøge disse, mens indkommen data bliver liggende i bufferen. Men hvad hvis behandlingen af de ti linjer tager for lang tid, da mistes vel nogle data, eller?
Avatar billede sjensen Nybegynder
08. oktober 2000 - 12:20 #3
Jeg bruger samme principper til nogle af mine programmer. D.v.s. hvor programmet opsamler nogle data fra com-porten der kommer ind 3-6 gange pr. sekund. Jeg skal også kun bruge noget af det.

For det første har jeg kobt Async Pro fra Turbopower. Det sikrer at alle data der kommer ind på porten huskes. Via Async Pro sættes en trigger op der reagere for hvert tegn der kommer ind på porten, uafhængigt af hvad programmet i øvrigt er igeng med, og dette gemmes i en datastreng. Derefter har jeg en timer der aktiveres 3-4 gange pr. sekund som checker om strengen indeholder det jeg har brug for. Hver gang timer aktiveres gennemgår jeg strengen og opsplitter den i de linier jeg har brug for. Det gør jeg med en stringlist. Derefter kører jeg listen igennem og finder de linier jeg skal bruge og gemmer dem/behandler dem. Derefter sletter jeg stringlisten igen.

Når timeren så starter igen starter jeg forfra.

Hvis der er meget databehandling kan jeg evt. disable timeren mens jeg behandler data og så enable den igen når jeg er færdig. Triggeren sørger for at jeg ikke mister data men selvfølgeligt vil det ende med at jeg kommer mere og mere bagud hvis min databehandling er langsommere end de data der kommer ind. MEN.. med en 500mhz processor og en datastrøm på 9600, 19200 eller 38400 er der ingen fare på færde. Maskinen \'sover\' alligevel meget af tiden.

Hvis det er et problem alligevel, kan du evt. sætte timeren til at køre i en tråd. Derved oprettes der en ny tråd hver gang timeren starter og de kører selvstændigt indtil de er færdige, hvorefter de forsvinder. Dette kan så gå et stykke tid.

Men jeg tror ikke du kan få noget serielt kommunikation til at tvinge en 500mhz maskine i knæ, så længe det er rent memory (og evt. noget harddisk skriveri) der er tale om.

Men igen er det async pro\'s trigger system der sikrer at jeg ikke mister nogle data på porten mens jeg arbejder med de data der er kommet. Der er rigtigt godt og koster kun 149$

Hvis ikke du kender den så kig på

http://www.turbopower.com
Avatar billede mick Nybegynder
08. oktober 2000 - 13:33 #4
Har set på Async Pro, men nyeste udgave koster $349,- og det er lige i overkanten..Så vigtigt er det heller ikke dette program.

Nu bruger jeg Varian Async32, som er freeware, men den er ikke så god. Kender du nogle andre freeware komponenter som kan bruges?

Nå men du gav mig nogle ideer til hvordan jeg skal komme videre, så tak for hjælpen.
Avatar billede anlsoft Nybegynder
13. juli 2008 - 02:15 #5
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester