尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”

Posted

技术标签:

【中文标题】尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”【英文标题】:Trying to open a serial port with pyserial on WinXP -> "Access denied" 【发布时间】:2011-01-05 00:23:39 【问题描述】:

我正在尝试使用 python 和 pyserial 通过串行端口将数据发送到 hplc 泵。我在 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()

【问题讨论】:

发布一些代码,因为没有它就无法确定您的流程。 请注意,仅当端口号为 10 或更大时,您才需要 \\.\COMxx 而不仅仅是 COMx(但因此,显然,一直使用它)。但是,最好使用正斜杠,因为它们可以避免反斜杠转义的问题。要么,要么使用带有r''的原始字符串。 【参考方案1】:

确保端口未被任何其他程序打开。 (这对我有用)

【讨论】:

【参考方案2】:

尝试将端口打开为\\.\COMxx

还要确保端口尚未从其他应用程序打开。我建议你使用超级终端查看端口是否打开。

【讨论】:

不,同样的问题 - 打开端口会导致“访问被拒绝”错误 好的 - 谢谢,这有帮助。我可以从超级终端轻松控制我的泵。显然端口在初始化时已经打开。在打开之前关闭它(self.ser.close())解决了这个问题。【参考方案3】:

当我试图从 TI Chronos 获取加速度计值时,我遇到了类似的问题。在设备管理器中,我只是禁用了 COM 端口并再次启用它。工作过

【讨论】:

【参考方案4】:

如果您已经在 构造函数!

【讨论】:

【参考方案5】:

当你执行时

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

串口已经打开。在 Windows 上,如果在端口已打开的情况下运行 .open() 会出现错误,但在 Linux 上却没有。这就是差异所在。

【讨论】:

【参考方案6】:

.close() 在我调用 .open() 之前也对我有用

【讨论】:

致那些前来寻求答案的人 - 这不是您正在寻找的答案。这个工作的原因是因为(如其他地方指出的).open() 不需要,在创建串行实例时打开端口。因此,在您创建端口后关闭它只会停止在您(错误地)再次打开它时出现的错误。【参考方案7】:

在打开端口之前调用 .close() 解决了一个让我抓狂的问题!

我让它在另一台使用 com0com 虚拟端口运行 vista 64 位的机器上工作,没有遇到问题。

我试图在我的 Windows 7 机器上使用完全相同的脚本 - nada - XP Mode 相同的东西。访问被拒绝或找不到端口(更改端口的寻址方式时)。当然,超级终端可以完美地识别和处理所有内容。

4 小时后,我找到了这个小块,现在一切正常。

我喜欢编程是件好事...嘎!

【讨论】:

以上是关于尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 python 和 pyserial 打开 /dev/ttyusb0

arduino 使用 pySerial 打开/关闭 LED

可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?

Python PySerial,如何打开串口?

从 Mac 上运行的 pyserial 打开串行端口时禁用 DTR

使用pyserial测试usb到串口到usb没有输出