Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
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: