Pregunta

Estoy intentando enviar datos a una bomba de HPLC a través del puerto serie utilizando Python y PySerial. He probado el cable y la bomba bajo Linux (un derivado de Gentoo), donde funcionó a la perfección, aunque como root. Ahora tengo que usar el código en una máquina de WinXP, donde siempre consigo un "acceso denegado" error al intentar abrir el puerto (i ajustado los parámetros de COMxx en lugar de ttySxx, el puerto se encuentra). Probé el puerto serie del ordenador, así como un adaptador USB2Serial. He oído que WinXP era bastante restrictiva a la hora de tratar de hacer frente a algún puerto con el código de auto por escrito. ¿Hay una solución simple para este problema que la instalación de 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

-> aquí i 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()
¿Fue útil?

Solución

Trate de abrir el puerto como \\.\COMxx

También asegúrese de que el puerto no está abierto desde otra aplicación. Le recomiendo que utilice Hyperterminal para ver si el puerto está abierto.

Otros consejos

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

No hay necesidad de llamar .open si ya pasar el puerto serie nombre / número en el constructor!

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 está ya abierto. En Windows, se produce un error si se ejecuta .open () si el puerto ya está abierto, pero no lo hace en Linux. Ahí es donde la discrepancia es.

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

lo tenía trabajando en otra máquina con Vista de 64 bits utilizando los puertos virtuales com0com, no un tirón.

Yo estaba tratando de trabajar en exactamente las mismas secuencias de comandos en mi caja de Windows 7 - nada - Modo XP misma cosa. Acceso denegado o no se pudo encontrar el puerto (cuando se cambia hasta cómo se abordó el puerto). HyperTerminal, por supuesto, reconocido y trabajó con todo sin problemas.

4 horas más tarde me encuentro esta pequeña pepita y ahora todo marcha a buen ritmo muy bien.

Es una buena cosa que disfrutar de la programación ... GAH!

He tenido un problema similar cuando yo estaba tratando de obtener los valores del acelerómetro de TI Cronos. En el administrador de dispositivos me acaba desactivado el puerto COM y activado de nuevo. Trabajado

Asegúrese de que el puerto no está abierto por ningún otro programa. (Que ha funcionado para mí)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top