Réinitialiser ouvrir un port série

Je suis de la lecture des données à partir d'un port série, envoyé par un arduino.

J'ai deux fichiers, j'utilise séparément à écrire un peu de code et essayer différentes choses. Dans l'un d'eux, j'ai lu les données, et j'ai dessiner à l'aide d'un matplotlib figure. Après avoir fini de l'utiliser, il reste connecté à mon ordinateur et l'envoi de données. Donc, ce que je dois faire est de "réinitialiser" le port. C'est, à proximité de l'ouverture du port et de l'ouvrir à nouveau, et l'arrêt de l'envoi de données afin que je puisse utiliser l'arduino pour essayer quelques modifications dans le code de ce fichier.

Pour accomplir cela, je veux dire, pour réinitialiser le port, j'ai créé un autre fichier et écrit ce code:

import serial

print "Opening port"

try:
  serial_port = serial.Serial("com4", 9600)
  print "Port is open"

except serial.SerialException:
  serial.Serial("com4", 9600).close()
  print "Port is closed"
  serial_port = serial.Serial("com4",9600)
  print "Port is open again"

print "Ready to use"

Mais ce code ne semble pas fonctionner.Le port est toujours connecté et l'envoi de données. Donc, cela veut dire que je ne peux pas fermer le port avec mon code,puis de le rouvrir à nouveau.

Ce que je fais mal? Comment puis-je arrêter l'arduino à partir de l'envoi de données? Ou comment puis-je réinitialiser le thw arduino, peut-être?

Espère que vous pourrez m'aider.

----- EDIT -----

- Je accomplir pour identifier le vrai problème que je vais avoir, et ce n'est pas ce que je pensais. Le problème n'est pas que le port a été ouvert, malgré que j'utilise le closefonction qui Pyserial ont. Le vrai truc, c'est que le port est en cours de fermeture que je veux, mais l'appareil (l'arduino) est encore l'envoi de données. Ainsi, j'ai changé le code pour reproduire la situation.

C'est le code:

print "Abriendo puerto"
ser = serial
try:
ser = serial.Serial("com4", 9600, timeout = 1)
serial_port = "Open"
print "The port %s is available" %ser
except serial.serialutil.SerialException:
print "The port is at use"
ser.close()
ser.open()
while ser.read():
print "Sending data"
ser.setBreak(True)
time.sleep(0.2)
ser.sendBreak(duration = 0.02)
time.sleep(0.2)
ser.close()
time.sleep(0.2)
print "The port is closed"
exit()

Avec ce code, ce que je fais, c'est:

1) j'ouvre le port série

2) Si l'appareil envoie des données, j'ai l'impression "Envoi des données"

3) Après 1 seconde, j'essaie de fermer le port et l'arrêt de l'appareil à partir de l'envoi de données

J'ai essayé ces deux dernières chose avec le close fonction pour fermer le port, et en lisant les docs que j'ai essayé avec setBreak et sendBreak comme vous pouvez le voir dans le code ci-dessus (je les ai laissés sur le but). Mais le dispositif est encore l'envoi des données, ce qui signifie que le code ne fonctionne pas.

Donc, est-il un moyen de dire à l'arduino "arrêter d'envoyer des données", ou puis-je réinitialiser l'appareil?

  • "Ce que je fais mal?" -- Vous n'êtes pas à expliquer ce que vous entendez par "ne fonctionne pas" et ce que vous attendez. Qu'est-ce que vous vous attendez à un "reset" de le faire? Pourquoi pensez-vous que vous en avez besoin? Vous vous demandez probablement une XY question. OIE que vous essayez de résoudre le mauvais problème et de poser la mauvaise question.
  • Je vous remercie pour votre commentaire. J'ai édité la question afin d'être plus clair.
  • J'ai des problèmes suite à votre description (par exemple, la surexploitation de "il"). Vous assumez trop et omettre de trop. Ce qui vous fait penser qu'un "reset" du port série est d'aller à "arrêter la arduino à partir de l'envoi de données"? (Le port de destination a peu ou pas de contrôle sur le port d'envoi.) "Ou comment puis-je réinitialiser le thw arduino, peut-être? "-- Que voulez-vous faire? Vous pourrait interrompre le transfert de données à l'aide de MATÉRIEL de contrôle de flux. Vous pourriez mettre en œuvre un protocole de transfert. Vous pouvez ajouter une ligne de commande pour forcer un hard reset de la carte Arduino.
  • Je vous remercie pour votre réponse encore une fois. Vous où le droit, ma question n'était pas claire. J'ai donc modifié à nouveau avec le véritable problème que je rencontre, que j'ai déjà identifiés grâce à vous et aux autres utilisateurs que de répondre aussi. Merci encore et j'espère que vous pourrez m'aider.
  • Je n'ai pas utiliser Arduino trucs, donc je n'ai pas de réponse pour ça. Série de liens (et les liens de communication en général) peuvent être classées en deux configurations. (1) Maître-esclave. L'appareil maître accorde l'autorisation de l'esclave à envoyer. C'est souvent une simple demande (à partir de maître) et la réponse (en esclave) boîte de dialogue. (2) le Peer-to-peer. N'importe qui peut envoyer à n'importe qui; vous avez choisi d'accepter les demandes ou pas, et de répondre ou pas. Ainsi, la topologie voulez-vous utiliser? Semble que vous avez besoin pour mettre en œuvre un gestionnaire de protocole dans l'Arduino pour qu'il accepte une commande de se taire. Ou utiliser le modem de lignes de contrôle.
  • Il y a aussi le modèle client-serveur, mais qui ne correspondent pas à votre configuration simple.
  • J'ai un problème similaire. Je reçois un signal de réinitialisation par l'ouverture de /dev/ttyUSB0 (Nano) mais pas de /dev/ttyACM0 (Onu) sur une Raspbian Jessie système. Question publiée ici: raspberrypi.stackexchange.com/questions/74252/...

InformationsquelleAutor Pablo Flores | 2016-04-26