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