Hallo,

der folgende Sketch zeigt das Listing auf einem Arduino Mega, der über die SS2 mit einem Uno Signale (ja, nein) austauscht und jeweils nur die Ausgänge 13 mit den LED's im 1 s-Rythmus ein/ausschaltet.
Für mich nicht erklärbar ist Folgendes:
direkt am Anfang der Loop befinden sich diese Befehle:
Code:
  Serial.println(millis());    //    
  
  if  ((millis()  -  Zeit_alt) > 100)  {   
    Serial2.readString();      //   Puffer leeren muss vor "ja" senden stehen
    Serial2.println("ja");    //    A sendet an B  ein     ja
    Serial.println("Zeitueberschreitung");
    delay(20);                // Verzögerung, damit UNO reagieren kann. Ohne funktioniert das Programm nicht

  }   //******************     ENDE   if  ((millis()  -  Zeit_alt) > 2000.0)     */
Wenn ich bei der SS2 den Tx am Mega unterbreche, erscheint auf dem SM des Mega wie erwartet die Fehlermeldung "Zeitueberschreitung" und natürlich die ms. Stelle ich die Verbindung wieder her, blinken die LED's wieder im gewohnten Takt.

Unterbreche ich aber den Rx der SS2 am Mega, dann kommt die Meldung "Zeitueberschreitung" nicht und die Ausgabe der millis bleibt bei einem Wert stehen. Stelle ich die Verbindung wieder her, dann blinkt alles wieder ganz normal. Auch wenn ich in die Loop ein delay(50) einbaue, ist das Verhalten dasselbe.
Ich interpretiere das so, dass der Mega in der Zeit steht. Vom Uno kommen während des Stillstands keine Telegramme, da der nur auf Telegramme vom Mega reagieren muss. Das kann ich auch an der Tx-LED des Uno erkennen.

Versteht das jemand?

Hier noch das Programm des Mega:

Code:
/*  Dieses Programm ist ein Test für die Kopplung 2er Arduinos über ihre seriellen Schnittstellen.
     Hier ist die SS2 benutzt =   Teilnehmer   A
     Die Initiierung der Schleife zwischen den beiden Teilnehmern erfolgt da durch,dass A ein ja sendet.
     Empfängt A ein    ja,  dann wird  ausgang an A HIGH gesetzt und sendet  an B ein    nein.
     Empfängt B ein    nein,  dann wird  ausgang an B LOW gesetzt und sendet  an A ein    nein.
     Empfängt A ein    nein,  dann wird  ausgang an A LOW gesetzt und sendet  an B ein    ja.
     Empfängt B ein    ja,  dann wird  ausgang an B HIGH gesetzt und sendet  an A ein    ja
     usw.
     Die LED's blinken dann bei 500 ms mit 1 Hz.
*/

int ausgang = 13;        // dient zur Anzeige der Signale
String Blinken = "ja";   // Variable, die die Info der Seriellen Schnittstelle vom anderen Teilnehmer aufnimmt
String Laenge;
unsigned long Zeit_alt = millis();

void setup() {

  Serial.begin (250000);   // Start der Seriellen Schnittstelle zum eigenen Seriellen Monitor
  while (!Serial);

  Serial2.begin (9600);   // Start der Seriellen Schnittstelle zum Teilnehmer B
  while (!Serial);

  pinMode (ausgang, OUTPUT);  // Deklarierrung von ausgang = PIN 13 als OUTPUT


}    //*****************  ENDE setup ****************************


void loop() {
delay(50);  
  Serial.println(millis());    //    
  
  if  ((millis()  -  Zeit_alt) > 100)  {   // muss größer 100 sein.
    //  muss außerhalb der available-Schleife stehen, damit auch ohne Empfang vom Uno gesendet wird.

    Zeit_alt = millis();

    Serial2.readString();      //   Puffer leeren muss vor "ja" senden stehen
    Serial2.println("ja");    //    A sendet an B  ein     ja
    Serial.println("Zeitueberschreitung");
    delay(20);                // Verzögerung, damit UNO reagieren kann. Ohne funktioniert das Programm nicht

  }   //******************     ENDE   if  ((millis()  -  Zeit_alt) > 2000.0)     */



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if (Serial2.available())       //   Abfrage, ob ein Signal von Teilnehmer B verfügbar?
  { 
    Blinken = Serial2.readStringUntil('\n');      //   der String enthält hinter dem gesendeten Text noch ein Steuerzeichen
    Serial.println(Blinken);
    Blinken.trim();                               // danach enthält Blinken nur den gesendeten Text

    Laenge = Blinken.length();
                                 //  die folgenden 5 Zeilen sind nur zur Info auf dem SM  
    Serial.print("Blinken53  =  ");
    Serial.println(Blinken);

    Serial.print("Laenge  =  ");
    Serial.println(Laenge);


    delay(500);
    Zeit_alt = millis();           //  muss hinter dem delay stehen

    if ((Blinken == "ja")  && (Laenge == "2")) {     //    Hat Teilnehmer B ein ja gesendet, dann  >>>>
      digitalWrite(ausgang, HIGH);
      Serial2.println("nein");   //    A sendet an B  ein     nein


    }   //******************     ENDE   if(Blinken == "ja")

    else   if ((Blinken == "nein")  &&  (Laenge == "4" )  ) {    //   Hat Teilnehmer B ein nein gesendet, dann  >>>>
      digitalWrite(ausgang, LOW);
      Serial2.println("ja");    //    A sendet an B  ein     ja

    }   //******************     ENDE   if(Blinken == "nein")


    Blinken = "x";
    Laenge = "";


  }    //  ***************ENDE    if (Serial2.available())  *************
  // das steht am Ende, damit Uno nur was sendet, wenn vom Mega was gekommen ist und nicht den Puffer vollschreibt, wenn nichts kommt

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


}   //******************     ENDE LOOP    *******************************
Gruß

fredyxx