PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LOOP bleibt stehen??



fredyxx
14.01.2017, 18:25
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:


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:



/* 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

Mxt
15.01.2017, 08:27
Hallo,

ich denke UART-Schnittstellen sind nicht dazu gedacht mit offenen Eingängen betrieben zu werden. Das kann schon zu merkwürdigem Verhalten führen.