Попытка открыть последовательный порт с pyserial на WinXP -> «Доступ запрещен» - PullRequest
5 голосов
/ 14 января 2010

Я пытаюсь отправить данные в насос 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()

Ответы [ 7 ]

11 голосов
/ 14 января 2010

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

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

8 голосов
/ 13 февраля 2010

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

4 голосов
/ 28 апреля 2011

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

3 голосов
/ 23 декабря 2010

При выполнении

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

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

1 голос
/ 26 января 2010

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

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

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

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

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

0 голосов
/ 16 декабря 2016

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

0 голосов
/ 24 мая 2011

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

...