Désactiver le signal DTR dans pyserial de code
Je suis en train d'utiliser pyserial pour envoyer des données à un arduino. Mais quand j'ai ouvert le port COM, il définit DTR faible et réinitialise le conseil d'administration. Cependant, j'ai mon code arduino configuration que j'ai pour le mettre en série le mode de réception en maintenant les deux boutons pendant 1 seconde. Je préfère ne pas avoir à faire la série d'entrée au démarrage de l'arduino, si possible.
Apparemment, vous pouvez modifier serialWin32.py fichier, changer la ligne suivante:
self._dtrState = win32.DTR_CONTROL_ENABLE
à:
self._dtrState = win32.DTR_CONTROL_DISABLE
Mais, est-il un moyen de le désactiver directement dans mon script python? J'ai également besoin de faire cela pour tous les systèmes. Je préfère ne pas forcer les gens à changer leur base de série config juste pour utiliser ce script.
Le port série est ouvert comme suit:
com = serial.Serial(port, baud, timeout=1);
Mise à jour: À la fin, j'ai trouvé une solution qui fonctionne très bien pour mon installation. Depuis je n'ai pas besoin de faire de Série de données tout le temps, seulement quand je mets l'appareil en série de la mode, j'ai trouvé un moyen pour désactiver la réinitialisation de série se connecter à partir de l'arduino lui-même.
De nombreux postes ont dit que vous pouvez désactiver le signal DTR réinitialiser en plaçant un ~résistance de 100 Ohm entre le 5V et la réinitialisation. Mais je ne veux pas que ce soit une chose permanente. Donc, au lieu de cela, j'ai placé une résistance entre PD5 et de réinitialisation. Ensuite, dans le logiciel:
void setup() {
//.......
DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
PORTD |= (_BV(PD5)); //Set high
//.......
}
inline void setResetDisable(bool state)
{
if(state)
DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
else
DDRD &= ~(_BV(PD5)); //set back to input mode
}
Alors maintenant, quand je veux être en mode série, j'appelle setResetDisable(vrai) qui met en 5V sur la résistance de 100 ohm et de la broche reset, la prévention des RIS de en le tirant faible et la réinitialisation de la puce 🙂
J'ai ensuite appeler setResetDisable(faux) quand je le laisse en mode série, de sorte que la puce peut être programmé comme d'habitude.
Vous devez vous connecter pour publier un commentaire.
Vous devrait pour être en mesure de désactiver le signal DTR avant l'ouverture du port, comme ceci:
Cependant, le faire sur la version actuelle de pyserial (2.6) sur Windows lance l'exception suivante:
Ce qui semble être un bug qui est corrigé dans la dernière version de la source, la révision SVN 445 29 décembre 2011 (voir http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32.py?view=log) avec commentaire:
Qui ressemble, il peut avoir manqué de peu la sortie de la version 2.6 (téléchargé le 2 novembre 2011, voir: https://pypi.python.org/pypi/pyserial).
En outre, à la recherche à la mise en œuvre actuelle de
setDTR()
de POSIX (en serialposix.py) il ressemble à ce bug n'est pas corrigé et une exception est levée si le port n'est pas ouvert, donc une croix-plate-forme de solution paraît peu probable.stty -hup
sur le port de cesse de le problème ainsi. Pourquoi est-ce? Comment est connecté à DTR?La désactivation de la DTR ne fonctionne pas pour moi:
ser.dtr = None
(Linux 4.4.0 x86_64 /Python 2.7.12 /PySerial 3.4)
Mais cela fonctionne:
Je l'ai trouvé ici.
La méthode que vous décrivez semble être la plus commune pour résoudre ce problème que j'ai vus, donc je pense qu'il n'y a pas plus simple solution logicielle. Bien sûr, vous pouvez modifier manuellement l'état de la ligne DTR à l'aide de
ser.setDTR(level)
- cependant, je n'ai pas essayé ce particulièrement dans le cas de l'Arduino autoreset, et je pense que même le basculement de la ligne immédiatement après l'ouverture du port série peut ne pas être assez rapide pour empêcher la réinitialisation.Les autres options, je peux voir que vous avez disponible serait de prévenir l'autoreset de l'Arduino dans le matériel (voir ici), ou pour changer votre code légèrement de sorte que vous permettez à l'Arduino pour redémarrer après un début de prise de la connexion série, et puis quand vous déclencher manuellement votre série mode de réception envoyer un premier signal à partir de l'Arduino pour montrer qu'il est maintenant prêt à recevoir des données. Ou sinon, vous pouvez inclure une version modifiée de la pySerial bibliothèque avec votre script.
Ici est une solution logicielle, j'ai été en utilisant moi-même pendant un certain temps et il fonctionne comme un charme:
Noter que le sommeil est la partie la plus délicate, sans elle, il l'habitude de travailler