Forum: Mikrocontroller und Digitale Elektronik Serielle kommunikation in beiden Richtungen


von Jens (Gast)


Lesenswert?

Hi Forum,

ich wollte einen Wemos D1 mini und einen Arduino nano every miteinander 
kommunizieren lassen. Was ich bis jetzt geschafft habe, ist vom ESP aus 
was Seriell schreiben und das vom nano auszulesen.
In die andere Richtung bekomm ich das jedoch nicht hin.
Mein Wunsch ist, dass ich Daten hin und her senden kann.
Ich habe schon einige Test Codes, die ich im Internet gefunden habe 
probiert, jedoch ohne erfolgt.
Hier sind die beiden funktionierenden Programme

Arduino nano every
1
String inputString = "";         // a String to hold incoming data
2
bool stringComplete = false;  // whether the string is complete
3
4
void setup() {
5
  Serial.begin(9600);
6
  Serial1.begin(9600);
7
8
  inputString.reserve(200);
9
}
10
11
void loop() 
12
{
13
  serialEvent();
14
}
15
16
void serialEvent()
17
{
18
  while (Serial1.available())
19
  {
20
    char inChar = (char)Serial1.read(); // das neue Byte erhalten:
21
    inputString += inChar;     // zum inputString hinzufügen:
22
23
    if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen, damit die Hauptschleife
24
      stringComplete = true;
25
  }
26
27
  if (stringComplete) {  // print the string when a newline arrives:
28
    Serial.println(inputString);
29
30
    inputString = "";   // clear the string:
31
    stringComplete = false;
32
  }
33
}

ESP
1
void setup() {
2
Serial.begin(9600);
3
}
4
5
void loop() {
6
Serial.println("Hi");
7
}

was ich jetzt probiert hatte, ist das ganze vom nano, sprich das 
serialEvent auf den ESP zu bringen, nur statt die empfangenen Daten 
Seriell auszugeben, wollte ich einfach die on-Board LED blinken lassen.

Könnte mir da jemand weiterhelfen?
Danke schonmal im vorraus!
Mfg

hier der nicht funktioniere ESP code:
1
String inputString = "";         // a String to hold incoming data
2
bool stringComplete = false;  // whether the string is complete
3
4
void setup()
5
{
6
  Serial.begin(9600);
7
  inputString.reserve(200);
8
9
  pinMode(2, OUTPUT);
10
}
11
12
void loop()
13
{
14
  if (inputString == "hi", 2)
15
  {
16
    digitalWrite(2, HIGH);
17
    delay(200);
18
    digitalWrite(2, LOW);
19
    delay(200);
20
    digitalWrite(2, HIGH);
21
    delay(200);
22
    digitalWrite(2, LOW);
23
    delay(200);
24
    digitalWrite(2, HIGH);
25
    delay(200);
26
    digitalWrite(2, LOW);
27
    delay(200);
28
    digitalWrite(2, HIGH);
29
    delay(200);
30
    inputString = ""; // String leeren
31
32
      //   Serial.println("hi");
33
  }
34
  serialEvent();
35
}
36
37
void serialEvent() {
38
  while (Serial1.available())
39
  {
40
    char inChar = (char)Serial1.read(); // das neue Byte erhalten:
41
    inputString += inChar;     // zum inputString hinzufügen:
42
43
    if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen, damit die Hauptschleife
44
      stringComplete = true;
45
  }
46
}

von grundschüler (Gast)


Lesenswert?

Jens schrieb:
> if (inputString == "hi", 2)

überprüf das mal. Was soll ", 2" bewirken?

von Nosnibor (Gast)


Lesenswert?

Und wenn du "Hi" sendest, solltest dur auch "Hi" empfangen wollen und 
nicht "hi"; Computer sind da pingelig.

Und den empfangenen String am besten auch nur auswerten, wenn 
stringComplete true ist, sonst gibt es eines Tages Missverständnisse 
("Hilfe!" wird dann auch erstmal als "Hi" verstanden. Aber nur manchmal, 
was die Fehlersuche erschwert).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> hier der nicht funktioniere ESP code:
Was sollte da weshalb passieren? Und was passiert statdessen?

> if (inputString == "hi", 2)
Ist in der String-Klasse der == Operator so überladen, dass das geht?

von Jens (Gast)


Lesenswert?

grundschüler schrieb:
> Jens schrieb:
>> if (inputString == "hi", 2)
>
> überprüf das mal. Was soll ", 2" bewirken?

Hi,

Ich hab versehentlich den Falschen Code gepostet(Peinlich). Hatte einen 
anderen, wo ich was austesten wollte. Ich hatte das mit strncmp versucht 
zu vergleichen, deshalb die ,2.

Nosnibor schrieb:
> Und wenn du "Hi" sendest, solltest dur auch "Hi" empfangen wollen und
> nicht "hi"; Computer sind da pingelig.

Ah okay, ist logisch. Hatte gedacht groß und klein Schreibung ist 
unwichtig. Habs geändert, jedoch ohne erfolg.

Nosnibor schrieb:
> Und den empfangenen String am besten auch nur auswerten, wenn
> stringComplete true ist

Alles klar, ist drin.

Hier jetzt noch mal der nicht funktionierende aktuelle ESP Code
1
String inputString = "";         // a String to hold incoming data
2
bool stringComplete = false;  // whether the string is complete
3
4
void setup()
5
{
6
  Serial.begin(9600);
7
  inputString.reserve(200);
8
9
  pinMode(2, OUTPUT);
10
  digitalWrite(2, HIGH);
11
}
12
13
void loop()
14
{
15
  if (stringComplete == true)
16
  {
17
    if (inputString == "hi") 
18
    {
19
      for (int i = 0; i < 5; i++)
20
      {
21
        digitalWrite(2, LOW);
22
        delay(200);
23
        digitalWrite(2, HIGH);
24
        delay(200);
25
      }
26
      inputString = ""; // String leeren
27
    }
28
  }
29
  serialEvent();
30
}
31
32
void serialEvent() {
33
  while (Serial.available())
34
  {
35
    char inChar = (char)Serial.read(); // das neue Byte erhalten:
36
    inputString += inChar;     // zum inputString hinzufügen:
37
38
    if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen, damit die Hauptschleife
39
40
      stringComplete = true;
41
  }
42
}

und der vom Nano
1
void setup() 
2
{
3
Serial1.begin(9600);
4
Serial.begin(9600);
5
}
6
7
void loop()
8
{
9
Serial1.println("hi");
10
Serial.println("hi");
11
delay(500);
12
}

Lothar M. schrieb:
> Was sollte da weshalb passieren? Und was passiert statdessen?

Eigentlich sollte die On-Board LED Blinken, was sie jedoch nicht tut.

Mfg

von EAF (Gast)


Lesenswert?

Lothar M. schrieb:
>> if (inputString == "hi", 2)
> Ist in der String-Klasse der == Operator so überladen, dass das geht?

Ja.
Ab 
https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/WString.h#L193

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.