Forum: Mikrocontroller und Digitale Elektronik Arduino - Serieller Empfang


von Konrad (Gast)


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!

von Stefan F. (Gast)


Lesenswert?

Wartet er wenigstens auf die Eingabe der ersten Zahl, oder übergeht er 
beide?

Ist Dir der Timeout bewusst? https://www.arduino.cc/en/Serial/SetTimeout

Hast du im Terminalprogramm eingestellt, daß nach Eingabe der Entertaste 
ein \n (Newline, LF) gesendet werden soll (nicht CR+LF)?

von Konrad (Gast)


Lesenswert?

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

Gruss

von Konrad (Gast)


Lesenswert?

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

Gruss

von Stefan F. (Gast)


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.

von Konrad (Gast)


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.

von Joachim B. (jar)


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())

von Stefan F. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.