我在Windows 7计算机上,尝试使用Python在我的Arduino上运行一个简单程序,使其闪烁。
出于某种原因,每当我尝试在PowerShell中运行脚本时,都会收到端口已经打开的错误。我尝试重新启动计算机,更改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!");
有什么不对吗?
答案 0 :(得分:3)
我可以看到为什么这不起作用的几个原因:
serial.open()
语句。首先,检查您的代码,确保实际上使用Arduino草图中的串口。您可以在代码中粘贴代码,以便我们检查出来。
然后,检查您的Python代码,确保实际在您的脚本中只执行一次打开串口。
最后,确保在运行脚本时没有其他程序打开串口,通常一个人倾向于测试与Arduino串行监视器的连接,让它打开并尝试使用脚本打开端口,不起作用。我经常从初学者那里看到它。
我投票给...问题#3 \ o /
class Ardustat():
def __init__(self):
self.port = ""
self.ser = serial.Serial() # Here you open the port once
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) # Here you open the port twice
我没有检查pySerial's源代码,但我非常确定serial.Serial()
打开了它找到的第一个以默认速度可用的串口。因此,当你没有关闭self.ser
的第一个实例的连接时,第二个实例会疯狂地说“伙计,它已经打开了!”。
这就是为什么你最好不要在正确的抽象(Artustat
)上添加抽象(pyserial.Serial
),而只是正确使用工具并执行以下操作:
with serial.Serial(port, speed) as ser:
do_blink(ser)
其中do_blink()
是您执行任务的函数。 with
上的serial.Serial
语句将处理串行端口对象的生命周期(当您进入块时打开它,在退出块时关闭它)。