2009-06-15 91 views
4

我有一個Python腳本,它通過pySerial將數據包寫入Arduino板。 有時在將代碼寫入主板時,pySerial會引發errno 5的輸入/輸出錯誤。使用pySerial從Python獲取輸入/輸出錯誤

一些研究表明,這表示在寫入表示與Arduino板連接的文件時出現錯誤。

發送的代碼,只發送單字節的數據包:

try: 
    # Check if it's already a single byte 
    if isinstance(byte, str): 
     if len(byte) == 1: # It is. Send it. 
      self.serial.write(byte) 
     else: # It's not 
      raise PacketException 
    # Check if it's an integer 
    elif isinstance(byte, int): 
     self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: raise PacketException # I don't know what this is. 
except Exception as ex: 
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__()) 

由該代碼印刷錯誤是:

OS錯誤輸入/輸出錯誤errno的5

我的代碼在發送時有問題嗎?我是否需要檢查串行連接是否準備好發送或發送後是否有延遲? 或者硬件或與硬件的連接有問題嗎?

編輯:我查看了pyserial的Linux實現,實現只是將錯誤傳遞給我的代碼。所以從那裏沒有新的真正的見解。 有沒有一種很好的方法來測試程序中發生了什麼?

回答

2

不好意思打擾了你,但我很確定這個錯誤是由arduino自己重置導致的,因此關閉了與計算機的連接。

+0

我有同樣的問題 - 你有任何想法如何趕上/防止這個錯誤? – 2013-05-13 18:07:26

1

唯一的問題我可以馬上看到你的代碼是一個壓痕問題 - 改變你的代碼如下:

try: 
    # Check if it's already a single byte 
    if isinstance(byte, str): 
     if len(byte) == 1: # It is. Send it. 
      self.serial.write(byte) 
     else: # It's not 
      raise PacketException 
    # else, check if it's an integer 
    elif isinstance(byte, int): 
     self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
     raise PacketException # I don't know what this is. 
except Exception as ex: 
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__()) 

我懷疑你的錯誤來源於此,但嘗試這種方式,讓我們知道!您僅在是int的情況下檢查其是否爲str,因此elif總是按定義失敗。但我想如果你真的代碼縮進是這樣的,你會得到一個SyntaxError,所以我認爲你只是錯誤張貼和你真正的問題仍然隱藏。

+0

你是對的intendation :) – Janusz 2009-06-15 05:08:25

1

如果您在Windows上運行此操作,則不能在運行Python腳本的同時打開Arduino IDE的串行連接。這會拋出同樣的錯誤。

+0

我想過一個錯誤,兩個程序或腳本寫入到arduino。我們在linux機器上運行這個程序,並且腳本是唯一寫的東西。程序中沒有線程。在出現錯誤之前,一些數據包會成功發送。 因此,第二個程序寫入連接似乎不太可能。 – Janusz 2009-06-15 14:55:33

0

讓我試着提供一些可能對您和其他有類似問題的人有用的評論。首先,嘗試使用串行監視器運行幾次Arduino草圖。您可以在IDE菜單的工具下找到串行監視器。您也可以鍵入Ctrl-Shift-M來調用串行監視器。

串行監視器顯示Arduino草圖發送給您的內容。但是,它也允許您輸入發送到Arduino草圖的數據。換句話說,您只需使用串行監視器即可測試和調試串行數據流的兩端。

看看出現了什麼。假設您的草圖嘗試通過Serial.print()發回數據,它經常會非常有幫助。幾個筆記。確保串行監視器內設置的波特率與草圖中的波特率完全一致(9600幾乎適用於所有情況)。

第二個注意事項非常重要。調出串行監視器強制在Arduino板上重置。你的素描開始(總是)。這是一件好事,因爲它每次都會讓你重新煥然一新。請注意,只需將波特率設置爲9600(即使它已經是9600),您也可以強制重置。這使您可以在串行監視器內運行多個測試,而無需每次都重新啓動串行監視器。