2013-06-25 50 views
3

我在一臺Windows電腦上,試圖用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

你是否排除這不是端口上的權限問題? Power shell是Windows 7的默認外殼,還是可以使用更簡單的東西? – macduff

+0

很確定它不是一個許可問題,因爲它讓我之前打開了端口。問題是它始終認爲端口已經打開。我已經運行其他程序嘗試關閉它,但沒有運氣。 感謝您的幫助 – user2520810

回答

3

我明白爲什麼這不工作的幾個原因:

  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.Serialwith聲明將處理串行端口對象的生命週期(在您輸入該塊時將其打開,在您退出塊時將其關閉)。

+0

感謝您的幫助。 – user2520810

+0

歡呼!我想這可能是在思考好幾個小時之後。 – user2520810

相關問題