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()
Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top