港口已在使用中

时间:2013-06-25 18:11:50

标签: python windows arduino

我在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!");

有什么不对吗?

1 个答案:

答案 0 :(得分:3)

我可以看到为什么这不起作用的几个原因:

  1. 在运行脚本时,您的串行监视器正在运行:
    • 串口只能在给定的主机上打开一次,如果你试图打开它两次,第二个打开它的程序会报告它已经打开。
  2. 您没有在Arduino端打开串行连接:
    • 你说你眨眼sketch。如果这是默认的blink.ino,它不会打开串口,系统可能会报告串口无法打开(我不知道Windows,但我不会感到惊讶发生不一致的错误)
    • 您编写了自己的闪烁草图,但未将Serial.begin(115200);放入草图文件的setup()
  3. 您在Python代码中打开端口两次(或更多次)。
    • 您的代码中只能有一个serial.open()语句。
  4. 首先,检查您的代码,确保实际上使用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语句将处理串行端口对象的生命周期(当您进入块时打开它,在退出块时关闭它)。