Für dieses Forum muß Javascript im Browser aktiviert werden!
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 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: > <code> 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 > // ... > > }</code> > > 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: > <code> > 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; > }</code> > > Alternative könnte man auch nur soviele Zeichen aus dem Puffer auslesen, wie nötig. > das wäre wahrscheinlich eleganter. ;-) > <code> > 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 > // ... > } > </code> > > > Ich habe dies jetzt nicht getestet, aber es sollte funktionieren. ;-) > > MfG André H.