尝试在 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
可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?