String seriell einlesen und teilen

Hey,

ich versuche gerade einen String seriell einzulesen was mir aber nicht wirklich gelingt Wird der String denn wirklich als String übergeben seriell?

Ich möchte einen String der zum Beispiel aussieht wie der hier: 1,1;2,2;3,4;4,8;5,16;6,32;7,64;8,128 seriell einlesen und ihn am Simikolon teilen das ich dann beim ersten zum Beispiel 1,1 habe. Dann soll das ganze am Komma noch mal geteilt werden so das ich hinter her die zwei zahlen als int in einer Variable habe.

Ich hoffe ihr versteht was ich will :smiley:

Wird der String denn wirklich als String übergeben seriell

Seriell liest immer zeichenweise.
In deinem Beispiel kommen '1' ',' '1' ';' usw. nacheinander an.
Es kann auch sein, dass nicht sofort alle Zeichen da sind.

Ob du alles erst zusammensammelst und dann an den Trennzeichen , und ; wieder trennst, oder alles gleich verarbeitest, ist deine Sache.

Dann soll das ganze am Komma noch mal geteilt werden so das ich hinter her die zwei zahlen als int in einer Variable habe.
Ich hoffe ihr versteht was ich will :grin:

In einer int Variable kann nur eine Zahl sein, und auch keine "1,1"
Das will ich also lieber nicht verstehen :wink:

fl3xizzz:
Dann soll das ganze am Komma noch mal geteilt werden so das ich hinter her die zwei zahlen als int in einer Variable habe.

Ich hoffe ihr versteht was ich will

Nicht so wirklich. Eine Zahl wie "4,8" sieht eigentlich eher wie eine Gleitkommazahl aus.

Zwei Zahlen in eine int Variable?

Meinst Du vielleicht, dass sowohl vor dem Komma als auch hinter dem Komma ein Byte-Wert im Wertebereich 0 bis 255 steht, so dass die beiden Bytes als Hi-Byte und Lo-Byte in eine Integer-Variable gepackt werden sollen?

ok es wurde wohl falsch verstanden...
1,1; ist keine Zahl sondern einzelne Werte die durch ein Komma getrennt sind da könnte auch genau so gut ein ? stehen.

fl3xizzz:
ok es wurde wohl falsch verstanden…
1,1; ist keine Zahl sondern einzelne Werte die durch ein Komma getrennt sind da könnte auch genau so gut ein ? stehen.

Keine Ahnung ob es sowas in der Art ist, aber ich habe mal eine Funktion gemacht, die man in der loop zum Einlesen aufrufen kann.

Je zwei durch Komma getrennte Werte werden als HighByte und LowByte interpretiert und zu einem Integerwert zusammengerechnet, mehrere durch Semikolon getrennte Werte werden hintereinander weg empfangen bis ein Timeout auftritt. In der Demo werden die empfangenen Zahlen bzw. der zusammengerechnete Integer-Wert einfach über Serial zur Kontrolle ausgegeben.

#define BAUDRATE 9600
void setup() {
  // put your setup code here, to run once:
  Serial.begin(BAUDRATE);
}

void LiesDieZahlen()
{
  byte LowByte=0, HighByte=0;
  unsigned int IntValue;
  int numberCount=0;
  boolean firstByteOK=false;
  const char byteseperator=',';
  const char numberseperator=';';
  char c;
  boolean timeout=false;
  boolean received=false;
  while (!timeout)
  {
    delay(10000/BAUDRATE+1);
    timeout=!Serial.available();
    if (timeout) 
    {
      if (received) // Timeout, nach der letzten Zahl folgt kein Semikolon
      {
          numberCount++;
          Serial.print(numberCount);
          Serial.print(". HighByte: ");
          Serial.print(HighByte);
          Serial.print(" LowByte: ");
          Serial.print(LowByte);
          Serial.print(" Integer: ");
          IntValue=HighByte*256+LowByte;
          Serial.println(IntValue);
      }
      return;
    }  
    while (Serial.available())
    {
      c=Serial.read();
      if (c>='0' && c<='9') received=true; // es wurde wenigstens eine Ziffer empfangen
      switch (c)
      {
        case byteseperator: 
          firstByteOK=1;
          break;
        case numberseperator:
          numberCount++;
          Serial.print(numberCount);
          Serial.print(". HighByte: ");
          Serial.print(HighByte);
          Serial.print(" LowByte: ");
          Serial.print(LowByte);
          Serial.print(" Integer: ");
          IntValue=HighByte*256+LowByte;
          Serial.println(IntValue);
          LowByte=0;
          HighByte=0;
          firstByteOK=false;
          break;
        case '0'...'9':
          if (!firstByteOK) HighByte=10*HighByte+(c-'0');
          else LowByte=10*LowByte+(c-'0');          
          break;  
      }
    }
  }
}


void loop() {
  // put your main code here, to run repeatedly: 
 LiesDieZahlen(); 
}