gpt4 book ai didi

python - 端口已被使用

转载 作者:可可西里 更新时间:2023-11-01 09:25:09 26 4
gpt4 key购买 nike

我在一台 Windows 7 电脑上,尝试使用 Python 在我的 Arduino 上运行一个简单的程序,让它闪烁。

出于某种原因,每当我尝试运行 PowerShell 中的脚本时,我收到一条错误消息,指出端口已打开。我试过重新启动我的电脑,改变 Arduinos,改变我插入的 USB 端口,运行一个不同的程序,我很确定关闭计算机与端口的连接。但是,我仍然遇到同样的错误。

我对 Python 和 Arduino 还很陌生,所以我可能会忘记一些非常简单的事情。我问过一位更有经验的 friend ,他说这是 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代码很长,但是在setup中有如下代码。

void setup()
{
//Startup Serial
Serial.begin(57600);
// Serial.println("Hi Dan!");

有什么问题吗?

最佳答案

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

  1. 在运行脚本时,您的串行监视器正在运行:
    • 串行端口在给定主机上只能打开一次,如果您尝试打开它两次,第二个打开它的程序将报告它已打开。
  2. 您没有打开 Arduino 端的串行连接:
    • 你说你眨眼sketch .如果这是默认的 blink.ino,它不会打开串行端口,您的系统可能会报告串行端口不可打开(我不知道 Windows,但我不会惊讶地看到不一致的错误发生)
    • 您编写了自己的闪烁草图,但没有将 Serial.begin(115200); 放入草图文件的 setup() 中。
  3. 您在 Python 中打开端口两次(或更多次)代码。
    • 您的代码中应该只有一个 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 实例的连接,第二个实例会疯狂地说“伙计,它已经打开了!”。

这就是为什么你最好不要在正确的抽象(pyserial.Serial)上添加抽象(Artustat),而是正确使用工具并做一些类似的事情:

with serial.Serial(port, speed) as ser:
do_blink(ser)

其中 do_blink() 是您执行任务的函数。 serial.Serial 上的 with 语句将负责串口对象的生命周期(进入 block 时打开它,退出 block 时关闭它)。

关于python - 端口已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com