Essayer d'ouvrir un port série avec pyserial sur Windows XP -> « Accès refusé »
-
20-09-2019 - |
Question
Je suis en train d'envoyer des données à une pompe hplc via le port série en utilisant python et pyserial. Je l'ai testé le câble et la pompe sous Linux (un dérivé de gentoo), où il a parfaitement fonctionné, mais en tant que root. Maintenant, je dois utiliser le code sur une machine Windows XP, où je reçois toujours une erreur « Accès refusé » lorsque vous essayez d'ouvrir le port (i ajusté les paramètres à COMXX au lieu de ttySxx, le port se trouve). J'ai essayé le port série de l'ordinateur, ainsi qu'un adaptateur USB2Serial. J'ai entendu que Windows XP était assez restrictive quand il s'agit d'essayer de répondre à un port avec le code auto écrit. Y at-il une solution plus simple pour ce problème que l'installation linux?
# -*- coding: utf-8 -*-
import sys
import time
import serial
from threading import Thread
"""
usage: cmdCapture workDirectory pictureTime pressureTime
"""
print 'successful import is successful'
workDir=sys.argv[1]
pressureThresh=float(sys.argv[3])
class doCapture(Thread):
def __init__ (self, workDir, pressureThresh):
Thread.__init__(self)
self.workDir=workDir
self.pressureThresh=pressureThresh
self.pressureTimer=0
-> ici i définir le port série
self.ser=serial.Serial(port='\\.\COM1', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1)
-> ici l'erreur se produit
self.ser.open()
def getPressure(self):
self.ser.write('PR')
return self.ser.read(size=8), timer.timer()
def run(self):
self.pressureTimer=time.timer()
while 1:
if self.pressureTimer<=(time.timer()-self.pressureTime):
self.p=getPressure()
print self.p
myCapture=doCapture(workDir, pressureThresh)
myCapture.start()
La solution
Essayez d'ouvrir le port comme \\.\COMxx
Assurez-vous également que le port est déjà ouvert depuis une autre application. Je vous recommande d'utiliser Hyperterminal pour voir si le port est ouvert.
Autres conseils
.close () avant appelé le .Open () a travaillé pour moi aussi
Pas besoin d'appeler .Open si vous passez déjà le nom / numéro de port série dans la constructeur!
Lorsque vous exécutez
self.ser=serial.Serial(port='\\.\COM1', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1)
le port série est déjà ouvert. Sous Windows, vous obtenez une erreur si vous exécutez .Open () si le port est déjà ouvert, mais vous ne le faites pas sur Linux. C'est là la différence est.
.close appel () avant d'ouvrir le port a résolu un problème qui me conduisait fou!
Je l'avais travailler sur une autre machine sous Vista 64 bits en utilisant des ports virtuels com0com, pas un problème.
Je suis en train de travailler sur les mêmes scripts exactement sur ma boîte Windows 7 - nada - mode XP même chose. Accès refusé ou n'a pas pu trouver le port (en cas de changement jusqu'à la façon dont a été traité le port). HyperTerminal, bien sûr, reconnu et a travaillé avec tout parfaitement.
4 heures plus tard, je trouve cette petite pépite et maintenant tout est fredonner très bien.
Il est une bonne chose que j'aime la programmation ... GAH!
J'ai eu un problème similaire quand je tentais d'obtenir des valeurs de l'accéléromètre de TI Chronos. Dans le gestionnaire de périphériques i juste désactivé le port COM et lui a permis de nouveau. A travaillé
Vérifiez que le port n'est pas ouvert par un autre programme. (Cela a fonctionné pour moi)