@thomasbart ich hab mal was ganz kleines gebaut.
Der folgende Sketch aufgespielt wartet, das Du im Seriellen Monitor oben etwas eingibst und sendest.
In diesem Fall ein Telegram, welches mit # begint, dann folgt ein Char als "channel" gefolgt von einem ; und einem weiterem welches den übergebenen Wert darstellt und gefolgt von einem * als EndeMarkierung.
Wenn Du eingibst #2,3* bekommst Du das zurück:
08:44:04.609 -> #
08:44:04.609 -> 2
08:44:04.609 -> ;
08:44:04.609 -> 3
08:44:04.609 -> *
08:44:04.609 ->
08:44:04.609 ->
08:44:04.609 -> Empfangen mein Kanal: 2
08:44:04.609 -> Servoposition: 3
Das ist jetzt einfach gemacht und mit Char, damit Du etwas siehst.
Normalerweise wird dem Telegram Byte-Werte übergeben, bzw. mehrstellige Zahlen - darum der Trenner.
Wenn Du als erstes nicht 2 angibst, ignoriert der Sketch alles folgende und wartet wieder auf das "Startzeichen". Ich hab zwischendurch die Ausgabe der Zeichen mit drin, vielleicht wirds dann verständlich ![]()
const byte startChar = '#';
const byte endChar = '*';
const byte delemiter = ';';
const byte myChannel = '2';
byte myServo;
enum status {anfang, kanal, trennung, zustand, ausfuehren, ende};
byte state = anfang;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
}
void loop()
{
if (Serial.available() > 0)
{
byte inByte = Serial.read();
Serial.println(char(inByte));
switch (state)
{
case anfang:
if (inByte == startChar)
{ state = kanal; }
break;
case kanal:
if (inByte == myChannel)
{ state = trennung; }
else
{ state = anfang; }
break;
case trennung:
if (inByte == delemiter)
{ state = zustand; }
else
{ state = anfang; }
break;
case zustand:
myServo = inByte;
state = ende;
break;
case ende:
if (inByte == endChar )
{ state = ausfuehren; }
else
{ state = anfang; }
break;
case ausfuehren:
Serial.print(F("Empfangen mein Kanal: "));
Serial.println(char(myChannel));
Serial.print(F("Servoposition: "));
Serial.println(char(myServo));
state = anfang;
break;
}
}
}