Hallo zusammen!

Ich versuche mit einem nodeMCU und einem ATmega eine serielle Verbindung herzustellen.
Bisher klappte das mit einem Single-ATmega328P-PU (Grundbeschaltung), problemlos. Außer, dass ich zum Programm aufspielen die serielle Verbindung zwischen den Geräten trennen musste.

Nun habe ich einen NANO. Bei dem funktioniert das auch, also Signale kommen an und er sendet die auch zurück. Ob ich SoftwareSerial verwende oder UART ist egal.

erstes Problem:
Ich nutze am nodeMCU die Pins für GPIO13 und GPIO15, in Verbindung mit SoftwareSerial. So wie ich raus fand, macht GPIO15 Schwierigkeiten.
Wenn der GPIO15 (als TX) mit dem RX0-Pin am NANO verbunden ist, dann startet das nodeMCU nicht durch (bleibt hängen) und das Aufspielen von Software schlägt auch fehl.
Nur wenn ich SoftwareSerial (und also andere Pins) am NANO verwende, dann funktioniert alles. Ist das nodeMCU einmal gestartet (auch die Schnittstelle per SoftwareSerial initialisiert)
und ich verkabele dann die beiden Geräte, dann funktioniert die Kommunikation zwischen beiden Geräten, sowohl mit SoftwareSerial, am Arduino NANO, als auch per UART RX/TX, am Arduino NANO.

zweites Problem:
Wenn ich SoftwareSerial verwende, bekomme ich grundsätzlich keine störungsfreie Kommunikation zwischen NANO und nodeMCU (Baudrate egal). Das kenne ich so auch nicht. Nach etwa 8 Zeichen schleicht sich der erste Fehler ein.
Und noch etwas: Störquellen sind da nicht, die ich als solches sehen würde, vorhandene Motoren laufen nicht, weil sie nicht angesteuert werden. Ich probiere einfach nur die serielle Kommunikation.

Jetzt hoffe ich, dass jemand hier schlau daraus wird und mehr Erfahrung hat, als ich und mir dazu etwas sagen kann!


zur Vollständigkeit, Code für nodeMCU
Code:
#include <SoftwareSerial.h>


SoftwareSerial mySerial(13, 15); // RX, TX


void setup() {
    //Wenn ESP mit Error 29 neu startet
    //ESP.eraseConfig();
    //ESP.reset();


  pinMode(13,INPUT);
  pinMode(15,OUTPUT);
  delay(5000);


  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {}


  mySerial.begin(4800);
  while (!mySerial) {}
  
}


int a;


void loop() { // run over and over
  if(mySerial.available()){
    while (mySerial.available()){
      Serial.write(mySerial.read());
    }
    delay(100);
  }
  else{
      a++;
      mySerial.print(a);
      mySerial.print("!");
      mySerial.print(a);
      mySerial.print("!");
       mySerial.print(a);
      mySerial.print("!");
       mySerial.print(a);
      mySerial.print("!");
      mySerial.println("Hello, world: ");
  }
  yield();
}
zur Vollständigkeit, Code für Arduino
Code:
#include <SoftwareSerial.h>


SoftwareSerial mySerial(3, 2); // RX, TX
  int a;


void setup() {
  delay(5000);
  mySerial.begin(4800);
  while (!mySerial) {}
}


void loop() { // run over and over
  while (mySerial.available()) {
    mySerial.write(mySerial.read());
  }
}
Der Code ist jetzt nur für SoftwareSerial, allerdings nicht ohne Störung in der Übertragung möglich.




Freundliche Grüße
Moppi