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. - 21.04.2007 15:34)
Als Antwort auf große Datenmengen über Ser.Schnittst. auslesen von wernerAZ - 16.04.2007 22:09
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
Hallo Werner,


> Hier meine Auswertung:
>
> function auswertung(gpsData gps,byte buf[])
> {
> string s14[14];
> int zaehler,pos;
> pos=0;
> //strx.split(buf,s14,','); geht leider nicht

Das kannn auch nicht gehen, da str.split() Strings als Parameter erwartet.
Bytearrays sind aber keine Strings (obwohl Strings ein Art von Bytearray sind).

> for zaehler=0 ... 255
>     {
>     if buf[zaehler]=='*' & pos==13
>        zaehler=255;      //Schleife verlassen
>     else if buf[zaehler]=='$'
>        {
>        for pos=0 ... 13
>            s14[pos]="";      //str.clear(s14[pos]); geht nicht richtig!

Definiere bitte "geht nicht richtig".
Bei mir geht's.

Allerdings kannst Du Stringarrays sehr viel einfacher (und schneller) löschen:

 mem.fill(s14, 14*32, 0); //Array als Referenz, 14 x 32 Byte, ASCII 0


>        pos=0;
>        }
>     else if buf[zaehler]==','
>        pos=pos+1;
>     else
>        str.putchar(s14[pos],buf[zaehler]);
>     }
> if strx.comp("GPRMC",s14[0])
>    {
>    gps.kennung=s14[0];
>    gps.zeit=s14[1];
>    gps.status=s14[2];
>    gps.breite=s14[3];
>    gps.breiteB=s14[4];
>    gps.laenge=s14[5];
>    gps.laengeL=s14[6];
>    gps.speed=s14[7];
>    gps.grad=s14[8];
>    gps.datum=s14[9];
>    //zeigeData(gps.gpsData gps);
>    }
> }
>

> Leider bekomme ich das Einlesen nicht auf die Reihe.
>
> function auslesen(gpsData gps,byte buf[])
> {
> byte c;
> //hwcom.flush();
> loop
>   {
>   wait hwcom.ready();
>   buf[0]=hwcom.receive(buf,6,12000);
>   wait hwcom.ready();
>   hwcom.send(buf,6);
>   wait hwcom.ready();


Ich glaube, Du kennst den sinn von hwcom.ready() nicht.
Mit ready kann man prüfen, ob die Schnittstelle "frei" ist.
Sprich, gerade keine Ausgaben stattfinden.
Bei Empfang von Daten macht es überhauptkeinen Sinn, auf Sendebereitschaft zu warten.
Du willst ja erst Empfangen.
Auch vor dem Aufruf von hwcom.send() macht es keinen Sinn, da das Warten
auf Sendebereitschaft bereits in hwcom.send() stattfindet.
Lediglich nach Aufruf der Sendefunktion kann es Sinn machen zu warten,
da der Sendevorgang meistens noch nicht abgeschlossen ist, nachdem hwcom.send()
aufgerufen wurde.
Beginnt man danach zu schnell auf das zu sendende Array schreibend zuzugreifen,
können die Daten etwas durcheinanderkommen.

Au�erdem mu�t Du mir bitte kurz erklären, worin hier der Sinn liegt:
 buf[0]=hwcom.receive(buf,6,12000);
Du speicherst im ersten Element von buf[] die Anzahl der empfangenen Bytes.
Allerdings ist buf[] auch das Array, in dem Du die Daten speicherst.
Somit überschreibst Du jedesmal das erste empfangene Byte mit der Anzahl
der empfangenen Bytes.
Das kann nicht gut gehen.

> Wie bekomme ich die Daten in den buf[255], damit mir meine Auswertung
> die Daten in mein type gpsData übernimmt und ich die Daten weiter Bearbeiten kann?

Zuerst: Definiere Bytearrays immer mit einer geradzahligen Anzahl an Elementen.

Versuch's mal mit folgenden Routinen.
Ich habe die gerade schnell zusammengestrickt.
Wegen nicht vorhandenem GPS-Empfänger kann ich diese aber nicht testen.

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
 
 ID="$GPRMC";
 start=strx.InStr(0, buf, ID, len, 6); // Nach "$GPRMC" suchen
 if start==-1 return 0;// Zeichenfolge wurde nicht gefunden
 
 ID="1310"; // Nach abschlieÃ?endem CRLF suchen:
 end  =strx.InStr(start, buf, ID, len-start, 2);
 if end==-1 return 0;// Zeichenfolge wurde nicht gefunden
 gps.kennung="GPRMC"; // Ist hier immer gleich

 ID=",";
 
 //gps.zeit
 pos=strx.InStr(start, buf, ID, end-start, 1) + 1;
 poslen=strx.InStr(pos, buf, ID, end-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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-pos,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;
}



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 - 21.04.2007 18:07)
    Re: große Datenmengen über Ser.Schnittst. auslesen (von André H. - 22.04.2007 13:57)
        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)
Re: große Datenmengen über Ser.Schnittst. auslesen (von wernerAZ - 21.04.2007 17:09)