Python 端口已在使用中
我在Windows7电脑上,试图用Python在我的Arduino上运行一个简单的程序,让它闪烁 出于某种原因,每当我尝试在中运行脚本时,都会收到一个错误,即端口已打开。我试着重新启动我的电脑,更换Arduinos,更换我插入的USB端口,运行一个不同的程序,我确信它会关闭电脑与端口的连接。然而,我仍然得到同样的错误 我对Python和Arduino还很陌生,所以可能有一些简单得让我忘记的东西。我问过一位更有经验的朋友,他说这是Windows的问题 这是相关代码。我在Python中使用的类如下所示Python 端口已在使用中,python,windows,arduino,Python,Windows,Arduino,我在Windows7电脑上,试图用Python在我的Arduino上运行一个简单的程序,让它闪烁 出于某种原因,每当我尝试在中运行脚本时,都会收到一个错误,即端口已打开。我试着重新启动我的电脑,更换Arduinos,更换我插入的USB端口,运行一个不同的程序,我确信它会关闭电脑与端口的连接。然而,我仍然得到同样的错误 我对Python和Arduino还很陌生,所以可能有一些简单得让我忘记的东西。我问过一位更有经验的朋友,他说这是Windows的问题 这是相关代码。我在Python中使用的类如下所
import serial
import socket
import glob
import pickle
from time import sleep,time
class Ardustat():
def __init__(self):
self.port = ""
self.ser = serial.Serial()
self.mode = "serial"
self.debug = False
def findPorts(self):
"""A commands to find possible ardustat ports with no Arguments, """
return glob.glob("COM*")
def connect(self,port):
if self.mode == "serial":
self.ser = serial.Serial(port,57600)
self.ser.timeout = 1 # what does this do?
self.ser.open()
return "connected to serial"
Python代码是
from ardustat_library_simple_dan import Ardustat
import time
serial_port = 'COM6'
ard = Ardustat()
#Connect to the irritating ardustat
ard.connect(serial_port)
for a in range(0,5):
ard.blink(serial_port)
time.sleep(.2)
Arduino代码很长,但在设置中有以下代码
void setup()
{
//Startup Serial
Serial.begin(57600);
// Serial.println("Hi Dan!");
有什么问题吗?我可以看出这不起作用的几个原因:
- 串行端口在给定主机上只能打开一次,如果您尝试打开它两次,打开它的第二个程序将报告它已打开
- 你说你眨眼。如果这是默认的
,它不会打开串行端口,您的系统可能会报告串行端口不可打开(我不知道,但如果出现不一致的错误,我不会感到惊讶)blink.ino
- 你写了你自己的眨眼草图,但你没有把
Serial.begin(115200)草图文件的
中的code>setup()
- 您的代码中只能有一条
语句serial.open()
serial.serial()
会以默认速度打开它找到的第一个可用串行端口。因此,当您没有关闭来自第一个实例的self.ser
的连接时,第二个实例会疯狂地说“伙计,它已经打开了!”
这就是为什么您最好不要在正确的抽象(pyserial.Serial
)之上添加抽象(Artustat
),而只需正确使用工具并执行以下操作:
with serial.Serial(port, speed) as ser:
do_blink(ser)
where
do\u blink()
是一个执行任务的函数。serial.serial上的with
语句将处理串行端口对象的生命周期(当您进入块时打开它,当您退出块时关闭它)。您是否排除了它不是端口上的权限问题?power shell是Windows 7的默认shell,还是您可以使用更简单的工具?非常确定这不是权限问题,因为它以前允许我打开端口。问题是它总是认为港口已经开放。我已经运行了其他程序试图关闭它,但没有成功。谢谢你的帮助,干杯!我想可能是想了好几个小时之后。
with serial.Serial(port, speed) as ser:
do_blink(ser)