Arduino - Serieller Empfang

Gast #5245931
Lesenswert?

Hallo liebes Forum,

ich möchte mittels Arduino und dem Terminal (TTerm) über den virtuellen 
Com-Port mit dem Arduino vom PC aus kommunizieren und zwei Zahlen 
entgegennehmen, die ich über das Terminal dem Arduino übergebe.
Leider funktioniert aber unten aufgeführter Code nicht, weil er immer 
die Eingaben überspringt und nicht auf das eigentlich gewünschte "ENTER" 
wartet, um den nächsten Zahlenwert entgegenzunehmen.

Das Ganze soll so ablaufen:
"Erste Zahl?" Erste Zahl wird eingegeben, ENTER
"Zweite Zahl?" Zweite Zahl wird eingegeben, ENTER
..Rechenoperation..
Wiederholung

Hier mein Code:
1
void setup()
2
{
3
  Serial.begin(9600);
4
}
5

6
void loop()
7
{
8

9
if(Serial.available()>0)
10
{
11
    String incoming[2] = "";
12
    Serial.println("**** Addiere auf dem Arduino ***");
13
    Serial.println("Erste Zahl: ");
14
     incoming[0] = Serial.readStringUntil('\n');
15
    Serial.println("Zweite Zahl: ");
16
     incoming[1] = Serial.readStringUntil('\n');
17

18
    Serial.println(incoming[0]);
19
    Serial.println(incoming[1]);
20
}
21
}

Könntet ihr mir helfen, was ich falsch mache?

Vielen Dank schonmal!
Gast #5246029
Lesenswert?

> Genau, die erste Zahl nimmt er an, die zweite ignoriert er.

> Nein, das mit dem Einstellen im Terminal war mir nicht bewusst.
> Kann es daran liegen?

Ja. Möglicherweise sendet das Terminal aufgrund der Einstellung zwei 
Bytes wenn die Enter Taste gedrückt wird (das war unter Windows sehr 
lange so üblich).

Wenn nun die Arduino Library sowoh CR als auch LF als Zeilenende 
interpretiert, dann erklärt das, warum die Zweite Eingabe ohne zu warten 
als Leerstring erfasst wird.
Gast #5246382
Lesenswert?

>Ist Dir der Timeout bewusst?
Nein, da er warten soll, bis ein besagtes ENTER eingegeben wird, was er 
aber nicht tut.

Ich habe es nun mit einem anderen "Indikator" anstatt ENTER (\n) 
versucht.
1
if (Serial.available() > 0) 
2
   {
3
      
4
      Serial.println(" ****** BEREIT ***** ");
5
      Serial.print("Erstes Byte: ");
6
      incomingString[0] = Serial.readStringUntil('a');
7
      Serial.println(incomingString[0]);
8

9
      
10
      Serial.print("Zweites Byte: ");
11
      incomingString[1]= Serial.readStringUntil('a');
12
      Serial.println(incomingString[1]);
13
   }

Auch hier ignoriert er jegliche Eingaben und springt ohne beider 
Eingaben von "Erstes Byte: " zu "Zweites Byte" und kehrt dann zurück auf 
"BEREIT".


Ich verstehe das wieder nicht..sollte doch soo einfach sein.
#5246389
Lesenswert?

versuche es mal so
1
 #define MAXBUFFER 200
2

3
  // reserve 200 bytes for the inputString:
4
  inputString.reserve(MAXBUFFER);
5

6

7
  while (Serial.available()) 
8
  { // get the new byte:
9
    char inChar = (char)Serial.read();
10
    // add it to the inputString:
11
    if( inputString.length()<(MAXBUFFER-2) )
12
    { if(isprint(inChar))
13
        inputString += inChar;
14
      // if the incoming character is a newline, set a flag so the main loop can
15
      // do something about it:
16
      if (inChar == '\r' ) 
17
      { inputString += '\0';
18
        inputString.toCharArray(serial_in_command, MAXBUFFER);
19
        if(strrchr(serial_in_command, '\r'))
20
          *strrchr(serial_in_command, '\r')='\0';
21
        stringComplete = true;
22
      }
23
    }
24
    else
25
    { Serial.println(F("serBUF ov-> DEL"));
26
      memset(&serial_in_command[0], 0, sizeof(serial_in_command)); // 30.554 Bytes
27
      inputString = "";
28
    } // if(chr_cnt<(MAXBUFFER-1))
29
  } // while (Serial.available())
Gast #5246442
Lesenswert?

>>Ist Dir der Timeout bewusst?
> Nein, da er warten soll, bis ein besagtes ENTER eingegeben wird,
> was er aber nicht tut.

Standarmäßig ist der Timeout eine Sekunde, länger wartet er dann nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren