Arduino beendet nach längerer Zeit keine Daten mehr an die serielle Schnittstelle

8

Ich verwende ein Arduino Uno rev2 -Gerät als fest verbundenes Gerät, das manchmal Signale an einen PC sendet (Windows 7 x64). Code kompiliert mit Arduino 1.0 Software von arduino.cc

Thema auf arduino.cc, Arduino beendet die Datenübertragung nach einer langen Zeit an Serial

Souce-Code

Es funktioniert perfekt, aber manchmal, nach einer langen Zeit, hört der PC auf, Daten vom Arduino-Gerät zu empfangen. Es ist kein Problem mit der PC-Software, da die gesamte Software (Kitt, Telnet, usw.) gleich funktioniert - ich kann Daten an den Arduino senden (das Gerät reagiert auf Befehle); Ich kann es einfach nicht zurückbekommen.

Ein ähnliches Problem wurde hier in beschrieben Die serielle Kommunikation stoppt nach langen Zeiträumen. , aber es wurde keine Lösung vorgeschlagen.

Das Trennen / Verbinden des Geräts löste das Problem vorübergehend, aber das kann keine Lösung sein, da das Gerät permanent und vollautomatisch verwendet werden soll.

Mit der Board-Reset-Taste, die das Programm & amp; Alle Werte zu Beginn werden nicht helfen. Daten werden nicht mehr vom PC empfangen.

Anmerkungen:

  1. millis () Rollover-Fehler ist nicht reproduzierbar auf Arduino Uno Board mit Arduino 1.0 Software - ich denke, das wurde behoben und millis () jetzt wirklich Rollover nur in 50 Tagen, wie es in der Dokumentation gesagt wird. Außerdem hat Code millis () unabhängigen Code , der auch nicht antwortet.

  2. Die LED, die beim Senden von Daten an den PC blinkt, blinkt weiterhin.

  3. Die Verwendung von Strings könnte die Speichernutzung erhöhen, aber dieses Programm ist viel zu klein, um ein Problem darzustellen. Kein zusätzlicher Speicher wurde nach mehr als 10 Stunden Programmlauf verwendet, daher werde ich mich nicht wirklich damit beschäftigen, Strings durch etwas anderes zu ersetzen, da das Problem mit dem seriellen Port weitaus größer ist.

Wenn Sie denken, dass das Problem im Arduino-Programmfehler liegt, denken Sie bitte daran, wie man TX blinkt & amp; Reset nicht hilfreich.

    
Max The Cat 05.12.2011, 17:37
quelle

4 Antworten

2

Vielleicht wäre ein Software-Reset Ihr Problem wäre gelöst. Ich habe den folgenden Code ausgeführt, um herauszufinden, ob ein Software-Reset die Uhr und damit die Funktion millis() zurücksetzen würde:

%Vor%

Wie im Code erklärt, erstellen Sie zum Starten der Software einfach einen Funktionszeiger auf Adresse 0 und rufen Sie ihn auf. Ich hatte tatsächlich befriedigende Ergebnisse:

%Vor%

Ich hoffe, das löst dein Problem:)

    
Matheus Rocha 23.05.2015 07:33
quelle
0

Wenn Sie ständig Arduino abfragen, können Sie als Workaround einen Watchdog in Arduino implementieren, der Arduino zurücksetzt, wenn er lange Zeit keine Daten an den PC ausgegeben hat. Sie können den Arduino-TX-Pin überwachen, ihn zu einem anderen Eingangspin bringen, den Interrupt verwenden ... Der Punkt ist, den Watchdog nach jeder TX-Aktivität zurückzusetzen.

    
avra 09.12.2011 11:33
quelle
0

Es ist möglich, dass die Uhr herumfaltet.

previousclock = millis () könnte kurz vor dem Umklappen auf einem hohen Wert hängen bleiben. Sie könnten den Test auf den Fall erweitern, dass (currentmilis & lt; previousmillis) plus / minus ein gewisser Fudge-Faktor ist.

BTW Es verwendete den Quellcode von ignas (der OP-Quellcode war ohne Registrierung nicht lesbar, und ich möchte mich nicht registrieren)

BEARBEITEN: Ich habe das Fragment unten von wakkerbot kopiert und es ein wenig bearbeitet. Es ist nur um Zeigen Sie, wie Wraparound Ihre last_action-Zeitstempel an den Anfang eines int-Intervalls setzen kann (wenn der bump-Wert kein Divisor für int_max ist) Sie könnten wahrscheinlich die obige / unterste Logik ein wenig vereinfachen, da Sie nur an Intervalltests interessiert sind. Der typedef für Stamp sollte natürlich an den Typ von millis () (unsigned long?) Und fakemillis () angepasst und durch millis () ersetzt werden.

%Vor%

Wenn Sie das obige Programm auf einem "normalen" Computer kompilieren und ausführen, können Sie sehen, wie schlecht und schlecht es geht. Das passiert auch auf deinem Arduino, IMHO.

Update: definitiv Überlauf / Rollover. (GIYF) Ссылка

Update2: nicht verwandt, aber schlechte Programmierpraxis:

%Vor%

Sie vergleichen hier zwei Strings. (Dies könnte von c ++ wie beabsichtigt behandelt werden, aber in C ist es einfach falsch. Ich würde auch vorschlagen, das Wiederholen von if (...) {...} durch eine riesige switch-Anweisung zu ersetzen, die zumindest das Anrufen vermeiden würde die Funktion substr () wiederholt (oder ist es inline?)

UPDATE 20111211: Hier ist eine wrap-oblivious compare & amp; set-Funktion, die einen -Zeiger für den zu vergleichenden und einzustellenden Wert und die Breite des beabsichtigten Intervalls benötigt:

%Vor%

Diese Funktion wird im Abschnitt loop () wie folgt verwendet:

%Vor%

Schließlich: IMHO ist der Grund, warum RESET nicht funktioniert, dass nicht alle globalen Variablen in der setup () Funktion initialisiert werden. Außerdem: Ich denke, Sie sollten die String-Dinger loswerden (gibt es GC in der Laufzeit?) Und stattdessen normale Zeichenpuffer verwenden.

    
wildplasser 09.12.2011 11:43
quelle
-2

Arduino nach ein paar Stunden ist nicht in der Lage, Befehle von Arayks und TX 900 mit Draht auszuführen, aber nach dem Neustart ist das Arduino aktiviert.

    
user31848 16.04.2017 05:08
quelle