String auf einen anderen String übertragen

Hallo,

ich komme gerade nicht weiter und hoffe, dass ihr mir vielleicht helfen könnt.
Folgendermaßen sieht es aus.
Über den Serial Monitor schicke ich einen Befehl in der Form von e340.
Der erste Buchstabe (hier e) soll für einen bestimmten internen Befehl verwendet werden und die 340 stellt einen Stellwert dar.
Nun müssen diese beiden Sachen von einander getrennt werden, damit der Stellwerte und der “Befehlswert” jeweils verwendet werden kann.
Hier mal ein Codebeispiel:

char inByte[5];
char buffer[4];
int i = 0;
char zeichen;
char fertig = 0;

void setup() {
  Serial.begin(57600);
}

void loop() {  
  if(Serial.available()){
    zeichen = Serial.read();

    if((zeichen != 'z') && (i < 10))
    {
      fertig = 0;
      inByte[i] = zeichen;
      inByte[i+1] = '\0';
      i++;
    }
    else fertig = 1;
  }
  
  if((fertig == 1) && (i > 0))
  {
    if(inByte[0] == 'a'){
      Serial.println("Befehl 1");
    }
    if(inByte[0] == 'e'){
      Serial.println("Befehl 2");
    }
    for(int n = 0; n<5 ;n++){
      buffer[n] = inByte[n+1];
      buffer[n+1] = '\0';
    }
    soll = atoi(buffer);
    i = 0;
  }             
}

Dies klappt aber nur beim aller ersten Durchlauf. Bei den nächsten reagiert er nicht, so dass als Wert für buffer eine 0 ausgegeben wird.

Wißt ihr woran es liegen kann?

Also das sieht für mich ziemlich verstruwwelt aus, und Serial.read() beschafft doch auch nur jedes Mal ein einziges Zeichen, oder irre ich mich... ?

Wie wärs denn mit was in der Form:

char inBytes[10];
int inBytesPos = -1;

void setup() {
  Serial.begin(57600);
}

void loop() {
  if (Serial.available()) {
    do {
      inBytes[++inBytesPos] = Serial.read();
    } while (inBytes[inBytesPos] != '\r' && inBytes[inBytesPos] != '\n' && inBytes[inBytesPos] != '\0' && Serial.available());

    if (inBytes[inBytesPos] == '\r' || inBytes[inBytesPos] == '\n' || inBytes[inBytesPos] == '\0') {
      int value = atoi(inBytes + 1);
      switch (inBytes[0]) {
        case 'a':
          Serial.print("Befehl 1: ");
          Serial.println(value);
          break;
        case 'e':
          Serial.print("Befehl 2: ");
          Serial.println(value);
          break;
      }
      inBytesPos = -1;
    }
  }
}

Ist aber nur so im Texteditor zusammengenagelt, es gibt keine Garantie für Funktion... ;)

Das ist richtig, dass man nur ein Zeichen seriell einlesen kann. Deswegen schreibe ich auch die Zeichen in ein Array um somit mehr Zeichen einlesen und verknüpfen zu können. Wie gesagt, beim ersten Durchlauf klappt es auch, aber nicht beim zweiten. Ich wüßte auch nicht, was man zurücksetzen sollte, oder ändern muss, damit es bei den weiteren Durchläufen klappt.

Dein Beispiel funktioniert bei mir leider nicht.

An Deiner Stelle würde ich meinen Code kräftig mit Serial.println zupflastern und schauen ob in den Variablen das drin steht was ich erwarte. Und zwar in allen. Sowas hilft ganz ungemein.

D.h. schreib hinter jede Zuweisung ein Print. Und in jeden If und jeden Else Zweig ein Print um zu schauen wo er reinläuft. Danach sollte sich der Nebel lichten.

Gruß, Udo

okay. Hab ich gemacht und den Fehler gefunden. Die for-Schleife kann raus und der Buchstabe steckt in inByte[1] statt wie vermutet in inByte[0]. Somit erhält man dann auch den Wert mit atoi(inByte+2) statt nur +1.

oh man, wie ich sowas liebe :)

Hi Syntec,

schau Dir mal das im Playground an: http://www.arduino.cc/playground/Code/Messenger

Dein Problem ist zwar weg, aber vieleicht hilft Dir das trotzdem noch weiter.

Udo

Hallo Udo,

ja stimmt, das hätte ich vermutlich auch verwenden können.
Werd ich mir für das nächste mal merken.