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 | ||
| ||
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) |