Befehle nacheinander senden?

Hey ich hab folgendes Problem:
Ich hab mehrere Befehl die ich nacheinander über die Serielle Schnittstelle versenden möchte.
Mein Problem ist das er alles was ich sende in einen Befehl zusammenpackt.
Kann mir da jemand weiterhelfen oder versteht mein Problem.
Ich sende sozusagen erst den Befehl dann den Abschluss.

elay(50);
Serial3.write(code1, sizeof(code1));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code2, sizeof(code2));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code3, sizeof(code3));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code4, sizeof(code4));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code5, sizeof(code5));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code6, sizeof(code6));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code7, sizeof(code7));
delay(50);
Serial3.write(abschluss, sizeof(abschluss));
delay(50);
Serial3.write(code8, sizeof(code8));

Sende bei jedem Befehl ein Abschlusszeichen, z.B. Zeilenvorschub. Dann lies bis zu diesem Zeichen ein und Du hast den Befehl.

Gruß Tommy

Das zeigt eigentlich genau mein Problem:

Serial.write(0x31)
Serial.write(0x31)
Serial.write(0x31)
Serial.write(0x31)

Sende bekommen ich als Ausgabe: 1111

ich hätte gerne
1
1
1
1

Wie meinst du jetzt wie ich das dann da machen soll?
wie kann ich bis z.b zu eine " " einlesen das er dann in die nächste Zeile springt?

Serial3.write(10);

nach jedem Befehl.

Zum Einlesen bis zum Zeilenvorschub gibt es viele Beispiele im Netz und auch hier im Forum. Da musst Du mal suchen.

Gruß Tommy

das beispiel mit 10 versteh ich nicht und wenn ich danach googel "Einlesen bis zum Zeilenvorschub".
Finde ich iergendwie auch ncihts was mit hilft.

bool einmal = true;
char abschluss[] = {'\n'};
char code1[] = {'1'};
char code2[] = {'2'};
char code3[] = {'3'};

void setup()
{
  Serial.begin(9600); // Serielle Verbindung starten (Monitor)
  Serial.println("Anfang");
}

void loop() // Hier beginnt der Loop-Teil
{
  if (einmal)
  {
    einmal = false;
    Serial.write(code1, sizeof(code1));
    Serial.write(abschluss, sizeof(abschluss));
    Serial.write(code2, sizeof(code2));
    Serial.write(abschluss, sizeof(abschluss));
    Serial.write(code3, sizeof(code3));
    Serial.write(abschluss, sizeof(abschluss));
  }
}

Ausgabe:

Anfang
1
2
3

Ist es das, was Du möchtest?

Serial3.println fügt ein Zeilenende (je nach bevorzugter Schreibweise also 10, 0x0A oder '\n' ) an.

Genaugenommen sogar zwei Zeichen, 0x0D (CR), 0x0A (LF)

Da wir nicht wissen wie z.B. code1 definiert ist, ist allerdings unklar, ob das ein sinnvoller Tip ist.

Serial3.write(code1, sizeof(code1));

sizeof macht mich allerdings stutzig:
Bei Binär-Übertragung, wenn also jedes beliebige Byte (Teil des) Befehls ist, ist das Ganze natürlich fraglich.

const char code1[] = "x12";
Serial3.println(code1);

… wäre z.B. sinnvoll

const byte code2[3] = {0x78, 0x31, 0x32 };
Serial3.write(code2, sizeof(code2)); Serial3.write('\n');

… hätte das gleiche Ergebnis

nomis321:
Finde ich iergendwie auch ncihts was mit hilft.

Serial Input Basics - updated

Serielle Daten empfangen und umwandeln

Könnte das helfen?

@agmue nein das ist auch nciht was ich such

das wird auch nacheinander als ein string geschickt

ich möchte alles einzel schicken befehl für befehl.
ich brauch irgenwie einen Zeilenubruch aber versteh nicht so ganz wie das funktioniert bei Serial.write.

Der Sketch in #5 sendet in Hex:

41 6E 66 61 6E 67 0D 0A 31 0A 32 0A 33 0A
 A  n  f  a  n  g CR LF  1 LF  2 LF  3 LF

Leider verstehe ich nicht, was Du möchtest. "Einzeln" müßtest Du genauer spezifizieren. Bei mir heißt das, durch ein Steuerzeichen '\n' (NewLine oder LineFeed) getrennt.

Gib uns doch mal den ganzen Sketch, nicht nur ein Fragment. Wichtig ist, wie die codeX deklariert sind.

Gruß Tommy

ich möchte alles einzel schicken befehl für befehl.
ich brauch irgenwie einen Zeilenubruch aber versteh nicht so ganz wie das funktioniert bei Serial.write

Wo liegt das Problem, wenn man gegenseitig nicht sehen kann, was dem anderen gerade gegen den Strich geht? Ist "nochmal erklären" die Hilfe?

Eine Idee:

Serial.write('1'); Serial.write('1'); Serial.write(10);
Serial.write("11\n",3); 
Serial.print("11\n");

Alle 3 Zeilen machen genau dasselbe, rufen sich sogar untereinander auf.
( print -> write(buf,len) ->write(byte) )
Serial verfügt über einen Puffer, so werden die Zeichen schneller dorthinein geschrieben als sie danach über die Leitung gehen, im Empfänger kommt, auch zeitlich gesehen, jeweils das Gleiche an. (Bei 9600 ca. jede ms ein Zeichen)

Kleine Variation von Tommys Vorschlag:
Gib uns doch mal einen ganzen Sketch, nicht nur ein Fragment. Wichtig sind immer die Variablendefinitionen.

wenn ich mir diesen code im Serial Port Monitor anschaue bekomm ich das in einer zeile als
1.1.1.1.1. ausgegeben.
ich möchte es aber als
1
1
1
1
1
haben

int eingang;

void setup()
{
  Serial.begin(115200); // Serielle Verbindung starten (Monitor)
  Serial3.begin(115200);
}

void loop() // Hier beginnt der Loop-Teil
{
 if (Serial.available())
 {
 eingang=Serial.read();

if (eingang=='1')
{
Serial3.write("1");Serial3.write(10);
Serial3.write("1");Serial3.write(10);
Serial3.write("1");Serial3.write(10);
Serial3.write("1");Serial3.write(10);
Serial3.write("1");Serial3.write(10);
}
}
}

Kann mir eigentlich jemand sagen warum das nicht geht

{
 if (Serial3.available())
{
  
ack=(Serial3.read());
Serial.write(ack);  
}


if (ack="hallo")
{
  Serial.print("test");
}

was mach ich da falsch

ich will eigentlich nur wenn Serial3 etwas bestimmtes empfängt einen Befehl ausführen?

Was ist der "Serial Port Monitor" , den du an Serial3 (Pins 14/15) angeschlossen hasst ?

(Warum zeigt er ein LineFeed-Zeichen als '.' an ? )

if (ack="hallo")

macht vermutlich nicht das was du dir vorstellst.

was mach ich da falsch

Du unterschlägst die Definition der Variablen ack. Davon hängt ab, was du genau falsch machst.
Im übrigen ist = eine Zuweisung, kein Vergleich.

das ist der Serial Port Monitor

damit kann mann die ganze verbindung anschauen

Wo bleibt die Variablendeklaration? Oder willst Du keine Hilfe mehr?

Gruß Tommy

hab das jetzt so gemacht
und ack hab ich als const char ack="49e9X*"

{
 if (Serial3.available())
{
  Serial.write(Serial3.read());
  if (ack==Serial3.read())
  Serial.print("test");

}

bekomme dann diese Meldung
warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (ack==Serial3.read())

Ok, ich bin raus. Hier werden wir doch nur ignoriert.

Gruß Tommy