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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> 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. > > <code> > 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); > } > } > }</code> > > 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: > <code> > 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); > } > }</code> > > 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.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB