Re: Stringumwandlung ->Crash ->Hilfe! Kategorie: Programmierung (von André H. - 19.02.2005 10:07) | ||
Als Antwort auf Stringumwandlung ->Crash ->Hilfe! von Gordon Klimm - 8.02.2005 7:23 | ||
| ||
Hallo Gordon, > Ich schreibe momentan ein Programm zur Ansteuerung eines Pyrometers. > > Dabei lese ich Strings über SWCOM ein und wandle diese in > eine Tabelle mit Zahlen um. > Bei dieser Aktion schmiert meine CC2 regelmä�ig ab und ich > finde nicht heraus woran es liegen könnte. > > Kann mir jemand helfen? > ... >... > > Erklärung: > Ich empfange bis zu 255 Triplets "123,234,3<cr>" über SWCOM. > Diese werden als string gespeichert und nach <cr> an die Funktion gegeben. > Dort sollen aus dem Text drei Zahlen erzeugt werden. (s.o.) > wenn ich die DEBUG-Zeilen aktiviere, sehe ich, > dass die CC2 irgendwann in DEBUG3 den ersten Faktor nicht > mehr kennt und mit Null multipliziert. > Kurz darauf ist alles zu spät und die CC2 läuft Amok. > Ich kann aber nicht ersehen warum das so ist. > Ich habe Deine Funktion nicht bis ins Tiefste analysiert. Dafür ist diese etwas unüberichtlich geschrieben. (korrektes Einrücken wäre hilfreich) Auch bräuchte ich ein paar mehr Infos, um helfen zu können: Hat der übergebene String garantiert immer max. 30 Zeichen ? Was für einen Wertebereich haben die Werte Deiner Triplets ? Wenn diese nur im Bytebereich liegen: Warum verwendest Du so viele Longs ? Ist sichergestellt, da� der SWCOM-Empfangspuffer nicht überläuft ? Dieser hat standardmä�ig nur 32 Byte. Also ggf. mit setbuf() erhöhen. Was gibt die Host-LED für eine Fehlermeldung aus ? Dies wäre für eine Analyse sehr wichtig. Hier eine kleine Anregung, um das Bearbeiten Deiner empfangenen Daten etwas kompakter zu machen: byte StringCnt,SubStrCnt,i,j; int wert[3]; string recString; string splitString[8],SubString[4]; ... StringCnt=strx.split(recString,splitString,13);// Nach CR teilen for i=0 ... <StringCnt { SubStrCnt=strx.split(splitString[i],SubString,','); if SubStrCnt<3 and i==(StringCnt-1) break; if SubStrCnt!=3 {//Fehler // ... continue; } for j=0 ... 2 { wert[i]=strx.getNum(SubString[j]); } // Ab hier Weiterverarbeitung der drei Zahlen // ... } In recString wäre der empfangene Datenstrom enthalten. Jedoch max. 30 Zeichen. Wenn Du mit swcom.receive() die Daten in ein Bytearray mit z.B. 256 Byte einliest, mu�t Du diesen etwas zerlegen, bevor diese Routinen benutzt werden können: byte data[256],temp[30],datalen,datapos,l,m; ... datapos=0; datalen=swcom.receive(data,255,0); while datapos!=datalen { if i==(StringCnt-1) { l=str.length(splitString[i]); if datalen-datapos >= 30-l { mem.copypos(recString,l,data,datapos,30-l); setStrLen(recString,30); } else { m=datalen-datapos; mem.copypos(recString,l,data,datapos,m); setStrLen(recString,l+m); } } else { if datalen-datapos>=30 { mem.copypos(recString,0,data,datapos,30); setStrLen(recString,30); } else { l=datalen-datapos; mem.copypos(recString,0,data,datapos,l); setStrLen(recString,l); } } // Hier die obige Routine einfügen //... } ... function setStrLen(byte s[], byte len) { s[31]=len; } Alternative könnte man auch nur soviele Zeichen aus dem Puffer auslesen, wie nötig. das wäre wahrscheinlich eleganter. ;-) byte StringCnt,SubStrCnt,i,j; int wert[3]; string recString; string splitString[8],SubString[4]; byte data[30],l,m; ... loop { if i!=(StringCnt-1) { l=0; m=30; } else { l=str.length(splitString[i]); m=30-l; } m=swcom.receive(data,m,0); mem.copypos(recString,l,data,0,m); setStrLen(recString,l+m); StringCnt=strx.split(recString,splitString,13);// Nach CR teilen for i=0 ... <StringCnt { SubStrCnt=strx.split(splitString[i],SubString,','); if SubStrCnt<3 and i==(StringCnt-1) break; if SubStrCnt!=3 {//Fehler // ... continue; } for j=0 ... 2 { wert[i]=strx.getNum(SubString[j]); } // Ab hier Weiterverarbeitung der drei Zahlen // ... } Ich habe dies jetzt nicht getestet, aber es sollte funktionieren. ;-) 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: |