2010-01-14 66 views
5

Estoy tratando de enviar datos a una bomba de hplc a través del puerto serie usando python y pyserial. Probé el cable y la bomba bajo Linux (una derivada gentoo), donde funcionó perfectamente, aunque como raíz. Ahora tengo que usar el código en una máquina WinXP, donde siempre aparece un error de "Acceso denegado" cuando intento abrir el puerto (ajusto los parámetros a COMxx en lugar de ttySxx, se encuentra el puerto). Probé el puerto serie de la computadora, así como un adaptador USB2Serial. Escuché que WinXP era bastante restrictivo a la hora de intentar abordar algún puerto con un código escrito por mí mismo. ¿Existe una solución más simple para este problema que la instalación de Linux?Intentando abrir un puerto serie con pyserial en WinXP -> "Acceso denegado"

# -*- 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 

-> aquí puedo configurar el puerto serie

self.ser=serial.Serial(port='\\.\COM1', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1) 

-> aquí el error ocurre

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() 
+0

publique un código ya que no hay manera de determinar su proceso sin él. – KevinDTimm

+1

Tenga en cuenta que necesita el elemento '\\. \ COMxx' en lugar de' COMx' solo cuando el número de puerto es 10 o más (pero, por lo tanto, obviamente, úselo todo el tiempo). Sin embargo, es mejor utilizar barras diagonales, ya que evitan problemas con escapes de barra invertida.O eso, o usa cadenas sin formato con 'r'''. –

Respuesta

11

intente abrir el puerto como \\.\COMxx

También asegúrese de que la el puerto ya no está abierto desde otra aplicación. Recomiendo que use Hyperterminal para ver si el puerto está abierto.

+0

no, el mismo problema: abrir el puerto causa un error de "acceso denegado" –

+6

ok, gracias, eso ayudó. podría controlar fácilmente mi bomba desde hiperterminal. obviamente el puerto ya estaba abierto cuando se inicializó. cerrarlo (self.ser.close()) antes de abrir resuelve el problema. –

1

Llamar .close() antes de abrir el puerto resolvió un problema que me estaba volviendo loco.

Lo tenía trabajando en otra máquina ejecutando vista de 64 bits utilizando puertos virtuales com0com, no es un problema.

Estaba tratando de trabajar en las mismas secuencias de comandos exactamente en mi cuadro de Windows 7 - nada - Modo XP lo mismo. Acceso denegado o no se pudo encontrar el puerto (al cambiar la forma en que se dirigió el puerto). HyperTerminal, por supuesto, reconoció y trabajó con todo sin problemas.

4 horas más tarde encuentro esta pequeña pepita y ahora todo está zumbando a lo largo de muy bien.

Es una buena cosa que me gusta programar ... ¡GAH!

8

.close() antes de llamar a los .open() trabajó para mí, así

+3

Para los que vienen aquí por una respuesta, esta es _no_ la respuesta que está buscando. La razón por la que esto funciona es porque (como se señaló en otro lugar) '.open()' no es necesario, el puerto se abre cuando se crea la instancia en serie. Así que al cerrarlo después de haber creado el puerto simplemente se detiene el error que surgiría cuando (incorrectamente) lo abriera nuevamente. – SiHa

3

Al ejecutar

self.ser=serial.Serial(port='\\.\COM1', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1) 

el puerto serie ya está abierto. En Windows, se obtiene un error si ejecuta .open() si el puerto ya está abierto, pero no en Linux. Ahí es donde está la discrepancia.

4

No necesita llamar a .open si ya ha pasado el nombre/número del puerto serie en el constructor !

0

Tuve un problema similar cuando estaba tratando de obtener los valores de acelerómetro de TI Chronos. En el administrador de dispositivos simplemente deshabilité el puerto COM y lo habilité nuevamente. Funcionó

0

Asegúrese de que el puerto no esté abierto por ningún otro programa. (Eso funcionó para mí)

Cuestiones relacionadas