2010-01-14 13 views
5

Sto provando a inviare dati a una pompa hplc tramite la porta seriale usando python e pyserial. Ho testato il cavo e la pompa sotto linux (una derivata gentoo), dove ha funzionato perfettamente, anche se come root. Ora devo usare il codice su una macchina WinXP, dove ottengo sempre un errore "Accesso negato" quando provo ad aprire la porta (ho regolato i parametri su COMxx invece di ttySxx, la porta è stata trovata). Ho provato la porta seriale del computer, oltre a un adattatore USB2Serial. Ho sentito che WinXP era piuttosto restrittivo quando si trattava di cercare di indirizzare qualche porta con un codice scritto da sé. C'è una soluzione più semplice per questo problema rispetto all'installazione di linux?Tentativo di aprire una porta seriale con pyserial su WinXP -> "Accesso negato"

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

-> qui ho impostato la porta seriale

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

-> qui l'errore si verifica

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

pubblica un po 'di codice in quanto non c'è modo di accertare il tuo processo senza di esso. – KevinDTimm

+1

Nota che hai bisogno della cosa '\\. \ COMxx' invece di solo' COMx' solo quando il numero di porta è 10 o superiore (ma, ovviamente, usalo sempre). È preferibile utilizzare le barre in avanti, tuttavia, poiché evitano i problemi con i backslash escape.O quello, o usa stringhe crude con 'r'''. –

risposta

11

provare ad aprire la porta come \\.\COMxx

Assicurarsi inoltre che il la porta non è già aperta da un'altra applicazione. Raccomando di utilizzare Hyperterminal per verificare se la porta è aperta.

+0

no, stesso problema: l'apertura della porta causa un errore "accesso negato" –

+6

ok - grazie, questo ha aiutato. Potrei facilmente controllare la mia pompa da hyperterminal. ovviamente la porta era già aperta quando inizializzata. chiudendolo (self.ser.close()) prima di aprire risolto il problema. –

1

Chiamare .close() prima di aprire la porta ha risolto un problema che mi stava facendo impazzire!

L'ho fatto funzionare su un'altra macchina che esegue Vista 64-bit utilizzando le porte virtuali di com0com, non un problema.

Stavo provando a lavorare sugli stessi identici script sul mio Windows 7 box - nada - XP Mode stessa cosa. Accesso negato o impossibile trovare la porta (quando si modifica la modalità di indirizzamento della porta). HyperTerminal, ovviamente, ha riconosciuto e ha funzionato con tutto in modo impeccabile.

4 ore dopo trovo questa piccola pepita e ora tutto sta ronzando bene.

È una buona cosa che mi piace programmare ... GAH!

8

.close() prima di chiamare i .Open() ha lavorato anche per me

+3

A quelli che vengono qui per una risposta - questa è la risposta che non stai cercando. Il motivo per cui questo funziona è perché (come indicato altrove) '.open()' non è necessario, la porta viene aperta quando viene creata l'istanza seriale. Quindi chiuderlo dopo aver creato la porta si ferma semplicemente l'errore che si presenterebbe quando lo si (erroneamente) riapriva. – SiHa

3

Quando si esegue

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

la porta seriale è già aperta. Su Windows, si verifica un errore se si esegue .open() se la porta è già aperta, ma non su Linux. Ecco dove è la discrepanza.

4

Non è necessario chiamare .open se si passa già il nome/numero della porta seriale nel costruttore !

0

Ho avuto un problema simile quando stavo cercando di ottenere i valori dell'accelerometro da TI Chronos. Nel gestore dei dispositivi ho appena disabilitato la porta COM e l'ho abilitata di nuovo. Funzionato

0

Assicurarsi che la porta non sia aperta da nessun altro programma. (Questo ha funzionato per me)