Go Down

Topic: PC-Kommunikation seriell, Abbruch wenn kein Signal (Read 1 time) previous topic - next topic

fran83

Hey Leute, hab mal versucht, mein Problem möglichst konkret im Topictitel zusammenzufassen.
Es geht um folgendes:
Ich will mit nem UNO eine automatische Bierbrausteuerung entwickeln bzw. die Hardware für die Kommunikation mit der Brausoftware an einem PC.
Dieser wird dann mittels USB und der virtuellen COM Schnittstelle regelmäßig (z.B. aller 30 Sekunden) verschiedene Kommandos an den Arduino senden, wie z.B. für das Auslesen der Temperatur
und den Status von Heizplatte und Rührwerk und das An/ausschalten der beiden letztgenannten. Allerdings kann es ja sein, dass die USB Verbindung mal abbricht (Kabel aus versehen rausgezogen oder ähnliches)
In diesem Fall soll natürlich nicht alles weiterlaufen, da sonst die Heizplatte ewig weiterheizt, sondern es soll ausgeschaltet werden, bis wieder einmal pro 30s ein Signal kommt.

Wie löse ich dieses Problem mit Arduino?

Vielen Dank für eure Hilfe

fran83

mde110

Du kannst über deine serielle Verbindung einen "Ping" laufen lassen. Also z.B: alle 5 Sekunden ein "Hallo" schicken.
Sobald der Arduino von deiner Software innerhalb von 10 Sek. kein Signal mehr bekommt muss er dann das Abschalten deiner Anlage etc. einleiten.

fran83

Würde da dieser Quellcode hier gehen oder würdest du das irgendwie besser /anders schreiben?

Code: [Select]
#include <Metro.h> // Include the Metro library

Metro serialMetro = Metro(30000);  // Instantiate an instance

int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // mein Code
        } else if (serialMetro.check() == 1){
                // Abbruch
        }
}

mde110

Die Metro Library kenne ich nicht. Auf die schnelle konnte ich auch nichts darüber finden.

Ich würde das über die Millies() Funktion und eine Long Variable lösen.

Also im Endeffekt so:
Wenn du den Text "Hallo" empfängst speicherst du dir den Empfangszeitpunkt (long SerTimerout) mit millies() ab.
Sobald die Zeit von 10 Sek abgelaufen(millies() - SerTimerout > 10000) ist, behandelst du die Abbruchroutine.

fran83


Die Metro Library kenne ich nicht. Auf die schnelle konnte ich auch nichts darüber finden.

Ich würde das über die Millies() Funktion und eine Long Variable lösen.

Also im Endeffekt so:
Wenn du den Text "Hallo" empfängst speicherst du dir den Empfangszeitpunkt (long SerTimerout) mit millies() ab.
Sobald die Zeit von 10 Sek abgelaufen(millies() - SerTimerout > 10000) ist, behandelst du die Abbruchroutine.


Hmm ich merke grade mein Quellcode ist unlogisch. (btw: hier ein Link http://playground.arduino.cc/Code/Metro)
Beispiel: Ich sende regelmäßig vom PC aus, und der Arduino liest das ab. D.H. serial.available() > 0 trifft zu.
Jetzt sende ich ja aber nur aller meinetwegen 5 Sekunden. Daher kann es sein, dass serialMetro.check() == 1 und gleichzeitig gerade nichts gesendet wird.
In dem Fall wird die Abbruchroutine eingeleitet, obwohl erst vor 5 Sekunden etwas gesendet wurde.

Also hier der gefixte Code:
Code: [Select]

#include <Metro.h> // Include the Metro library
#define SERTIMEOUTABORT 30000

Metro serialMetro = Metro(SERTIMEOUTABORT); 

int incomingByte = 0;   // for incoming serial data


void setup() {
    Serial.begin(9600);     
}

void loop() {
    // send data only when you receive data:
    if (Serial.available() > 0) {
        // mein Code
        SerialMetro.reset()
    } else if (serialMetro.check() == 1){
        // Abbruch
    }
}


Mit Millies()
Code: [Select]
#define SERTIMEOUTABORT 30000

int incomingByte = 0;   // for incoming serial data
long SerialTimeout = 0;

void setup() {
    Serial.begin(9600);     
}

void loop() {
    // send data only when you receive data:
    if (Serial.available() > 0) {
        // mein Code
        SerialTimeout = millies()
    } else if (millies() - SerialTimeout > SERTIMEOUTABORT){
        // Abbruch
    }
}

Richtig so?

Go Up