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 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&lt;cr&gt;" über SWCOM. > > Diese werden als string gespeichert und nach &lt;cr&gt; 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.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB