3

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

有什么问题吗?

4

1 回答 1

3

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

  1. 在运行脚本时,您的串行监视器正在运行:
    • 串口只能在给定主机上打开一次,如果您尝试打开它两次,第二个打开它的程序会报告它已经打开。
  2. 您没有在 Arduino 端打开串行连接:
    • 你说你运行一个眨眼草图。如果这是默认设置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 的源代码,但我很确定serial.Serial()会以默认速度打开它发现可用的第一个串行端口。因此,由于您没有从 的第一个实例关闭连接self.ser,因此第二个实例会疯狂地说“老兄,它已经打开了!”。

这就是为什么您最好不要Artustat在正确的抽象 () 上添加抽象 ( pyserial.Serial),而只是正确使用工具并执行以下操作:

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

wheredo_blink()是你做你的事情的功能。with语句 over将serial.Serial处理串行端口对象的生命周期(进入块时打开它,退出块时关闭它)。

于 2013-06-25T18:26:27.583 回答