Arduino cesse d'envoyer des données sur le port série après une longue période de temps
Je suis en utilisant un Arduino Uno rev2 appareil comme appareil connecté en permanence que, parfois, envoie des signaux à un PC (Windows 7 x64). Le Code compilé avec Arduino 1.0 logiciel de arduino.cc
Sujet sur arduino.cc, Arduino cesse d'envoyer des données à la Série après une longue période de temps
Il fonctionne parfaitement, mais parfois, après une longue période de temps, l'ordinateur cesse de recevoir des données de l'Arduino appareil. Il n'est pas un logiciel PC problème, comme tous les logiciels(mastic, telnet, etc..) agit de la même manière - je peut envoyer des données À l'Arduino (le dispositif répond à des commandes); je ne peux pas le recevoir.
Un problème similaire a été décrit ici dans La communication série s'arrête après de longues périodes., mais aucune solution n'a été proposée.
Connecter/déconnecter l'appareil a résolu le problème temporairement, mais cela ne peut pas être une solution, car l'appareil est censé être utilisé en permanence et de manière entièrement automatique.
À l'aide de carte bouton de réinitialisation rétablit programme & toutes les valeurs de début de la coutume de l'aide. Les données ne commencent à être reçu par le PC.
Notes:
-
millis() roulement de bug n'est pas reproduit sur un Arduino Uno conseil avec Arduino 1.0 logiciel - je suppose que cela a été corrigé et millis() maintenant de faire vraiment de roulement seulement en 50 jours, comme il est dit dans la documentation. En plus de code a millis() code indépendant de la qui ne répond pas trop.
-
LED qui clignote lors de l'envoi des données vers le PC continue à clignoter.
-
Chaînes d'utilisation pourrait augmenter l'utilisation de la mémoire, mais ce programme est bien trop petite pour que ce soit un problème. Aucune mémoire supplémentaire n'a été utilisé après 10 heures de programme en cours d'exécution, donc je ne vais pas la peine de remplacer des Chaînes de caractères avec autre chose, comme port Série problème est bien plus grandes.
Si vous pensez que le problème est dans le programme arduino bug, merci de penser à comment expliquer TX clignote & reset ne l'aide pas.
Ce code vous aide à envoyer des données vers le PC? Même code que dans le message lié? Quelle est la version de la carte Arduino logiciel utilisez-vous (certains changements ont été apportés à
Serial
dans le récemment publié la version 1.0)?Jeff, à l'aide de mastic/SecureCRT ou moniteur de série à partir de arduino.cc IDE la même action: 1. réussir à se connecté à conseil d'administration 2. envoyer des commandes à la carte (je peux le contrôler) 3. pas de caractères sont reçus.
Matthieu Murdoch, j'ai passé à 1.0 récemment. Que des erreurs se montre dans long période de temps, j'ai besoin de quelques jours pour se reproduire.
Êtes-vous passer toutes les charges? J'ai eu des cas où la commutation des charges inductives comme les pompes provoque l'Arduino à perdre de son pied, qui exige que les pilotes de le recharger ou le câble connecté et rebranché, même si le code Arduino continuerait à fonctionner.
OriginalL'auteur Max The Cat | 2011-12-05
Vous devez vous connecter pour publier un commentaire.
Peut-être faire une réinitialisation logicielle de votre problème serait résolu.
J'ai couru le code suivant pour savoir si un logiciel de réinitialisation de se réinitialiser l'horloge et donc la
millis()
fonction:Comme expliqué dans le code, de faire un logiciel de redémarrer il suffit de créer un pointeur de fonction à l'adresse 0 et de l'appeler.
J'ai, en effet, eu des résultats satisfaisants:
J'espère que cela résout votre problème 🙂
OriginalL'auteur Matheus Rocha
Si vous avez constamment sondage de l'Arduino, puis comme une solution de contournement, vous pouvez mettre en œuvre un chien de garde dans Arduino qui va réinitialiser Arduino, si elle n'a pas de sortie des données vers le PC pendant une longue période. Vous pouvez surveiller Arduino pin TX, l'amener à une autre broche d'entrée, l'utilisation d'interruption... Le point est à watchdog reset après chaque TX d'activité.
OriginalL'auteur avra
Il est possible que les plis autour de l'horloge.
previousclock = millis() peut se retrouver dans une haute valeur, juste avant de plier autour de. Vous pouvez étendre le test d'inclure le cas que (currentmilis < previousmillis) plus/moins certains facteur.
BTW Il utilisé ignasi du code source (à l'OP code source n'était pas readble sans inscription, et je ne veux pas de la régistration)
EDIT: j'ai copié le fragment ci-dessous à partir de wakkerbot, et modifié un peu. C'est juste pour
démontrer comment enveloppante pouvez obtenir votre last_action horodateurs coincé en haut d'un int interval (si la majoration de la valeur n'est pas un diviseur de int_max)
Vous pourriez probablement simplifier la ci-dessus/en-dessous de la logique un peu, puisque vous vous intéressez seulement à l'intérieur/à l'extérieur de l'intervalle de tests. La définition de type de Timbre doit bien sûr être adapté au type de millis() (unsigned long ?) et fakemillis() supprimés et les références à son remplacement par millis().
Si vous compilez et exécutez le programme ci-dessus sur un "normal" de l'ordinateur, vous pouvez voir l'badlast et badtest coincé. Qu'est ce qui se passe sur votre arduino, trop, à mon humble avis.
Mise à jour: définitivement débordement de tonneaux. (GIYF)
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1200662708
Update2: non, mais les mauvaises pratiques de codage:
De la comparaison de deux chaînes de caractères ici. (ce peut être gérée comme prévu par le c++, mais en C, il est tout simplement faux. Je voudrais aussi suggérer le remplacement de la répétition if(...) {...} par un géant de l'instruction switch, qui permettrait au moins d'éviter d'appeler la fonction substr() à plusieurs reprises. (ou est-elle insérée?)
Mise à JOUR 20111211: ici est une synthèse inconscient comparer&ensemble de la fonction il a besoin d'un pointeur de la valeur à comparer et à régler, et la largeur de l'intervalle:
Cette fonction est utilisée dans la boucle() l'article comme suit:
Enfin: à mon humble avis, la raison pour laquelle RESET ne fonctionne pas, c'est que pas toutes les variables globales sont initialisées dans le setup() de la fonction. Aussi: je pense que vous devriez vous débarrasser de la Chaîne des bidules (il n'y a GC dans le runtime ?) et l'utilisation de caractères ordinaires tampons à la place.
Depuis le lien vers le forum (répondre#2) : "Le compteur est un entier long non signé. À 16Mhz, c'est de 550 secondes, qui est d'environ 9 heures."
Oui, je suis conscient du mauvais code 🙂 je vais essayer la mise en œuvre de roulement de détection et une sortie de plus de fonction que l'habitude d'utiliser la minuterie à tous. Si il l'HABITUDE d'EXPLIQUER la RÉINITIALISATION du PROGRAMME de l'HABITUDE de l'AIDE. RÉINITIALISER réinitialise toutes les variables à zéro et redémarre le programme à partir du début, n'est-ce pas? Mais RÉINITIALISER l'habitude de récupérer une connexion série.
millis() NE réinitialise lorsque le conseil est remis à zéro.
OriginalL'auteur wildplasser
Arduino, après quelques heures, n'est pas en mesure d'exécuter des commandes à partir Arayks et TX de 900 avec du fil de fer, mais après le redémarrage de l'Arduino est activé.
OriginalL'auteur user31848