Frage zu Serieller Verbindung

Hey Leute,

Ich bekomme über den Vom-Port einen String rein ( z.B. so einen : #01256/ )
Die Ersten 2 Zahlen sollen die Portnummer darstellen und die restlichen Zahlen (2-6) Analoge Daten.
Das einlesen der Daten bekomme ich hin, und das Trennen des Strings nur zum Teil. Wenn eine “0” in dem String vorkommt, wird diese gelöscht, wie kann ich dies vermeiden ?

und zu dem möchte ich, die Werte in einem Array speichern, was ich auch noch nicht so ganz hinkriege. Meine Idee ist (ich hoffe man kann den Grundgedanken erkennen) das der erste Wert ( in dem fall 01) Die Position des Arrays bestimmen soll und der zweite Wert(256) der dazu gewiesene Wert sein soll.

int data1;
int data2;
String String1;
String String2;
String DataIn = "";
char character;
int data[2] ;



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

void loop() {
  
  while(Serial.available()) {
      character = Serial.read();
      DataIn.concat(character);}
  
  if (DataIn.startsWith("#")&& DataIn.endsWith("/")){
    Serial.println("Daten koennen verarbeitet werden");
    Serial.print("Eingegebene Daten: ");
    Serial.println(DataIn);
    DataIn.replace("#","");
    DataIn.replace("/","");
    Serial.println(DataIn);
  
    String1 = (DataIn.substring(0,2));
    data1 = (String1.toInt());
    Serial.print("data1=" );
    Serial.println(data1);  
    
   
    String2 = (DataIn.substring(2));
    data2 = (String2.toInt());
    Serial.print("data2=" );
    Serial.println(data2);
  }
  
  else {
    Serial.println("Daten koennen NICHT verarbeitet werden");
  }
  
  
  data[data1] == data2; 
  
  Serial.print("array:  ");
  Serial.println(data[1]);
  Serial.println("");
  

  
  
  delay(1000);
  
  DataIn = "";
}

und die Ausgabe sieht wie Folgt aus:

Daten koennen verarbeitet werden
Eingegebene Daten: #01256/
01256
data1=1
data2=256
array: 23855

data1 sollte ja “01” sein
data2 ist wie gesagt so weit in Ordnung, außer es kommt eine “0” drinn vor.
und bei “Array” habe ich mir eigentlich den Wert von data2 erhofft.

Ich hoffe, ihr versteht, wo mein Problem liegt.

Schonmal lieben dank! :slight_smile:

Marco

das mit der "0" hab ich schonmal hingekriegt mit einem:

DataIn.replace("0","0");

lg

Marco

Das ist viel zu kompliziert. Am besten man trennt sowas mit Kommas ab. Wenn man dann C Strings statt die String Klasse verwendet, kann man das ganz einfach mit strtok() parsen. Und es spielt keine Rolle mehr wie viele Stellen eine Zahl hat

Den Serial Monitor so einstellen das ein LF oder CR am Ende gesendet wird:

const unsigned int SERIAL_BUFFER_SIZE = 17;
char serial_buffer[SERIAL_BUFFER_SIZE];

int data[2];

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

void loop()
{
  if (read_serial() == true)
    parse_serial();
}

bool read_serial()
{
  static byte index;

  while (Serial.available())
  {
    char c = Serial.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serial_buffer[index++] = c;
    }
    else if (c == '\n' || c == '\r')
    {
      serial_buffer[index] = '\0';
      index = 0;
      return true;
    }
  }

  return false;
}

void parse_serial()
{
  Serial.print(F("string: ")); Serial.println(serial_buffer);

  int index = atoi(strtok(serial_buffer, ","));
  int number = atoi(strtok(NULL, ","));

  Serial.print(F("index: ")); Serial.println(index);
  Serial.print(F("number: ")); Serial.println(number);

  if (index < sizeof(data) / sizeof(data[0]))
    data[index] = number;
  else
    Serial.println(F("index out of bounds"));

  Serial.print(F("data: "));
  for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++)
  {
    Serial.print(data[i]);
    Serial.print(',');
  }
  Serial.println('\n');
}

Dann einfach eingeben, z.B.:
0,100
oder
1,356

Hemules:
das mit der "0" hab ich schonmal hingekriegt mit einem:

DataIn.replace("0","0");

Das verstehe ich jetzt nicht, gibt bestenfalls Murks.

Deine Variablen sind alle "int", da ist es egal ob die als "1", "01" oder "00000000000001" ausgegeben werden, der Wert ist immer 1.

Ich habe gar nicht erst versucht zu verstehen, was da im Detail abläuft, aber sein Problem ist glaube ich das Parsen. Und wenn man da versucht die Teil-Strings über die Indizes zu erhalten (mit substring()), dann muss die Eingabe konstant breit sein. Also eben "01" oder "02" für einstellige Zahlen. Die Lösung ist es die Zahlen durch Kommas zu trennen (oder ein anderes Trennzeichen). Wenn man dann nicht die String Klasse verwendet hat man die Zahlen in zwei Zeilen extrahiert und gewandelt. Egal ob man "1" oder "01" eingibt.