Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 端口已在使用中_Python_Windows_Arduino - Fatal编程技术网

Python 端口已在使用中

Python 端口已在使用中,python,windows,arduino,Python,Windows,Arduino,我在Windows7电脑上,试图用Python在我的Arduino上运行一个简单的程序,让它闪烁 出于某种原因,每当我尝试在中运行脚本时,都会收到一个错误,即端口已打开。我试着重新启动我的电脑,更换Arduinos,更换我插入的USB端口,运行一个不同的程序,我确信它会关闭电脑与端口的连接。然而,我仍然得到同样的错误 我对Python和Arduino还很陌生,所以可能有一些简单得让我忘记的东西。我问过一位更有经验的朋友,他说这是Windows的问题 这是相关代码。我在Python中使用的类如下所

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

有什么问题吗?

我可以看出这不起作用的几个原因:

  • 运行脚本时,串行监视器正在运行:
    • 串行端口在给定主机上只能打开一次,如果您尝试打开它两次,打开它的第二个程序将报告它已打开
  • 您没有打开Arduino端的串行连接:
    • 你说你眨眼。如果这是默认的
      blink.ino
      ,它不会打开串行端口,您的系统可能会报告串行端口不可打开(我不知道,但如果出现不一致的错误,我不会感到惊讶)
    • 你写了你自己的眨眼草图,但你没有把
      Serial.begin(115200)setup()
      中的code>
  • 在代码中打开端口两次(或更多)。
    • 您的代码中只能有一条
      serial.open()
      语句
  • 因此,首先,检查您的代码,确保您确实使用了Arduino草图中的串行端口。您可以将代码粘贴到问题中,以便我们检查

    然后,检查Python代码,确保在脚本中确实打开了串行端口一次,而且只打开了一次

    最后,请确保在运行脚本时不要让另一个程序打开串行端口,通常会测试与Arduino的串行监视器的连接,让它打开,然后尝试使用脚本打开端口,但这不起作用。我经常从初学者那里看到这一点

    我投票支持。。。问题#3\o/

    我没有检查源代码,但我非常确定
    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)