Попытка открыть последовательный порт с помощью pyserial на WinXP - ›Доступ запрещен

Я пытаюсь отправить данные на насос hplc через последовательный порт с помощью python и pyserial. Я тестировал кабель и насос под Linux (производная от Gentoo), где он работал отлично, хотя и с правами root. Теперь мне нужно использовать код на машине WinXP, где я всегда получаю ошибку «Доступ запрещен» при попытке открыть порт (я настроил параметры на COMxx вместо ttySxx, порт найден). Я попробовал последовательный порт компьютера, а также адаптер USB2Serial. Я слышал, что WinXP был довольно ограничен, когда дело дошло до попытки адресовать какой-либо порт самописным кодом. Есть ли более простой способ решения этой проблемы, чем установка 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

-> здесь я устанавливаю последовательный порт

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

-> здесь происходит ошибка

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

person Community    schedule 14.01.2010    source источник
comment
опубликуйте код, так как без него невозможно определить ваш процесс.   -  person KevinDTimm    schedule 14.01.2010
comment
Обратите внимание, что вам нужна вещь \\.\COMxx, а не просто COMx, только когда номер порта 10 или больше (но, следовательно, очевидно, что используйте его все время). Однако лучше использовать косую черту, поскольку они позволяют избежать проблем с экранированием обратной косой черты. Либо так, либо используйте необработанные строки с r''.   -  person Peter Hansen    schedule 14.01.2010


Ответы (7)


Попробуйте открыть порт как \\.\COMxx

Также убедитесь, что порт еще не открыт из другого приложения. Я рекомендую вам использовать Hyperterminal, чтобы узнать, открыт ли порт.

person kgiannakakis    schedule 14.01.2010
comment
нет, такая же проблема - открытие порта вызывает ошибку отказа в доступе - person ; 14.01.2010
comment
ок - спасибо, это помогло. Я мог легко управлять своей помпой с гипертерминала. очевидно, что порт уже был открыт при инициализации. закрытие (self.ser.close ()) перед открытием решило проблему. - person ; 14.01.2010

.close () до того, как я вызвал .open (), тоже работал у меня

person Madmartigan    schedule 13.02.2010
comment
Тем, кто приходит сюда за ответом - это не ответ, который вы ищете. Причина, по которой это работает, заключается в том, что (как указано в другом месте) .open() не требуется, порт открывается при создании последовательного экземпляра. Таким образом, закрытие его после того, как вы создали порт, просто останавливает ошибку, которая может возникнуть, когда вы (неправильно) откроете его снова. - person SiHa; 25.07.2014

Нет необходимости вызывать .open, если вы уже передали имя / номер последовательного порта в конструкторе!

person David    schedule 28.04.2011

Когда вы выполняете

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

последовательный порт уже открыт. В Windows вы получите сообщение об ошибке, если запустите .open (), если порт уже открыт, но не в Linux. Вот где несоответствие.

person Cory Cross    schedule 23.12.2010

Вызов .close () перед открытием порта решил проблему, которая сводила меня с ума!

У меня он работал на другой машине с 64-разрядной версией Vista, использующей виртуальные порты com0com, без проблем.

Я пытался работать над теми же сценариями на моем компьютере с Windows 7 - нада - XP Mode то же самое. Отказано в доступе или порт не может быть найден (при изменении адресации порта). HyperTerminal, конечно, все распознал и работал безупречно.

Через 4 часа я нахожу этот маленький самородок, и теперь все идет отлично.

Хорошо, что мне нравится программировать ... GAH!

person Crazy Joe Malloy    schedule 26.01.2010

У меня была аналогичная проблема, когда я пытался получить значения акселерометра от TI Chronos. В диспетчере устройств я просто отключил COM-порт и снова его включил. Работал

person Jay    schedule 24.05.2011

Убедитесь, что порт не открыт какой-либо другой программой. (Это сработало для меня)

person forzagreen    schedule 16.12.2016