Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: große Datenmengen über Ser.Schnittst. auslesen Kategorie: Programmierung (von André H. - 22.04.2007 13:57)
Als Antwort auf Re: große Datenmengen über Ser.Schnittst. auslesen von wernerAZ - 21.04.2007 18:07
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
Hallo Werner,

> Habe deine Routine mal ausprobiert, Andre'.
> ...
> Leider liest diese Routine nicht korrekt ein.
> Positionen werden wo anders angezeigt und in den Werten stehen auch Kommas drin.
> GPRMC steht immer an der richtigen Stelle, zeit, datum usw. sind durcheinander.
> Trotzdem vielen Dank für deine Mühe.

Sorry. Ich hatte einen Fehler in meinen Routinen beim Finden der
einzelnen Kommas. (Falscher Parameter)
Ich habe das geändert und über Hyperterminal getestet, indem ich die von Dir geposteten
GPS-Datenrahmen über Hyperterminal als Textdatei gesendet habe.
Bei meinem Test gerade wurde alles korrekt ausgegeben.


type gpsData
{
 string kennung;
 string zeit;
 string status;
 string breite;
 string breiteB;
 string laenge;
 string laengeL;
 string speed;
 string grad;
 string datum;
 string gradM;
 string direction;
 string mode;
 string checksum;
}

function setStrlen(byte gpsstring[], byte len)
{
 mem.fillpos(gpsstring, len, 31-len, 0);// ungenutzte Bytes ggf. auf 0 setzen
 gpsstring[31]=len;
}

function getGPRMC(gpsData gps) returns int
{byte buf[250], len, start, end, pos, poslen;
 string ID;
 len=hwcom.receive(buf, 250, 500); //250Byte empfangen
 if len==0 return 0;
 
 ID="$GPRMC";
 start=strx.InStr(0, buf, ID, len, 6); // Nach "$GPRMC" suchen
 if start==255 return 0;// Zeichenfolge wurde nicht gefunden
 
 ID="13"; // Nach abschlieÃ?endem CRLF suchen:
 end  =strx.InStr(start, buf, ID, len-start, 1);
 if end==255 return 0;// Zeichenfolge wurde nicht gefunden
 gps.kennung="GPRMC"; // Ist hier immer gleich

 ID=",";
 
 //gps.zeit
 pos=strx.InStr(start, buf, ID, end, 1) + 1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.zeit, 0, buf, pos, poslen-pos);
 setStrlen(gps.zeit, poslen-pos);
 //gps.status
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.status, 0, buf, pos, poslen-pos);
 setStrlen(gps.status, poslen-pos);
 //gps.breite
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.breite, 0, buf, pos, poslen-pos);
 setStrlen(gps.breite, poslen-pos);
 //gps.breiteB
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.breiteB, 0, buf, pos, poslen-pos);
 setStrlen(gps.breiteB, poslen-pos);
 //gps.laenge
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.laenge, 0, buf, pos, poslen-pos);
 setStrlen(gps.laenge, poslen-pos);
 //gps.laengeL
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.laengeL, 0, buf, pos, poslen-pos);
 setStrlen(gps.laengeL, poslen-pos);
 //gps.speed
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.speed, 0, buf, pos, poslen-pos);
 setStrlen(gps.speed, poslen-pos);
 //gps.grad
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.grad, 0, buf, pos, poslen-pos);
 setStrlen(gps.grad, poslen-pos);
 //gps.datum
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.datum, 0, buf, pos, poslen-pos);
 setStrlen(gps.datum, poslen-pos);
 //gps.gradM
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.gradM, 0, buf, pos, poslen-pos);
 setStrlen(gps.gradM, poslen-pos);
 //gps.direction
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.direction, 0, buf, pos, poslen-pos);
 setStrlen(gps.direction, poslen-pos);
 //gps.mode
 ID="*";
 pos=poslen+1;
 poslen=strx.InStr(pos, buf, ID, end,1);
 mem.copypos(gps.mode, 0, buf, pos, poslen-pos);
 setStrlen(gps.mode, poslen-pos);
 //gps.checksum
 pos=poslen+1;
 mem.copypos(gps.checksum, 0, buf, pos, end-pos);
 setStrlen(gps.checksum, end-pos);

 return -1;
}


function line(byte s[])
{
 hwcom.num(s[31]);
 hwcom.tab();
 hwcom.print2(s);
 hwcom.ret();
}

thread main
{byte in[512];
 gpsData gps;
 hwcom.setbuf(in,512);
 hwcom.clr();
 loop
 {
  if getGPRMC(gps)
   {
    hwcom.ret();
    line(gps.kennung);
    line(gps.zeit);
    line(gps.status);
    line(gps.breite);
    line(gps.breiteB);
    line(gps.laenge);
    line(gps.laengeL);
    line(gps.speed);
    line(gps.grad);
    line(gps.datum);
    line(gps.gradM);
    line(gps.direction);
    line(gps.mode);
    line(gps.checksum);
   }
 }
}


Das Testprogramm läuft mit 9600 Baud. (War zu faul, ein setspeed() einzufügen. ;-) )


Um auf Deine Frage mit dem erfassen der GPS-Daten in einem eigenen Thread einzugehen:
Das ist natürlich möglich.
Jedoch solltest Du die Zugriffe auf die GPS-Daten beim Zugriff dann capturen.
Ansonsten kann es nämlich sein, da� ein Teil des Datensatzes aktueller ist, als ein anderer.
Alternativ kann man mit einer aus der Sicht der VM atomaren Funktion die Daten
im Einlesethread umkopieren:

inline function copyGPS (gpsData dest[], int destpos, gpsData src[], int srcpos, int len )
{//abgeänderte Funktion mem.copypos()
 inline vmcodes.VM_INLINE_SYSCALL+mem.Segment;
 inline mem._COPY;
}

gpsData gps;
gpsData gpsglobal;// Daten für andere Threads

thread einlesen
{
  if getGPRMC(gps)
   {
    copyGPS(gpsglobal,0,gps,0,32*14);
   }
}


Hier werden die GPS-Daten mittels der für den eigenen Datentyp angepassten
Funktion mem.copypos() aus Sicht der VM in einer Instruktion kopiert, ohne, daÃ?
ein Threadwechsel während des Kopiervorgangs erfolgt.
Da die Routine auf ASM basiert, ist diese nebenbei äu�erst schnell. ;-)
Die 32 mal 14 bedeuten lediglich, da� 32 x 14 Byte kopiert werden müssen.
(14 Strings à 32Byte)


MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: große Datenmengen über Ser.Schnittst. auslesen (von wernerAZ - 23.04.2007 21:29)
    Re: große Datenmengen über Ser.Schnittst. auslesen (von Mark Simon - 12.10.2010 12:14)