2015-05-19 83 views
6

我一直在尋找標題中提到的錯誤的答案,但第一次我haavent得到了答案呢。我們將嘗試使我的Raspberry pi讀取模擬數據,但是當我在終端窗口中運行代碼時,它會給我'IOError:[Errno 5]輸入/輸出錯誤'。'IOError:[錯誤5]輸入/輸出錯誤',而使用SMBus通過RPi模擬讀取

用於讀取模擬數據的代碼如下所示。我使用PCF8591 ADC轉換器。

from smbus import SMBus 

bus = SMBus(0) 

print "read a/d press ctrl + c to stop" 

bus.write_byte(0x48, 0) 
lastval = -1 

while True: 
    reada = bus.read_byte(0x48) 
    if(abs(lastval-reada) > 2): 
    print(reada) 
    lastval=reada 

據我所知,這可能是因爲樹莓派版本發生變化,我應該將SMBus(0)更改爲SMBus(1)。爲此,我檢查了我的RPi版本,這不是修改後的版本。但我仍然試圖通過改變SMBus編號來運行該程序,但仍然沒有運氣。

我得到的錯誤如下所示:

Traceback (most recent call last): 
    File "analogread.py", line 7, in <module> 
    bus.write_byte(0x48, 0) 
IOError: [Errno 5] Input/output error 

任何幫助表示讚賞。這是我試圖執行的更大項目中的基本塊。所以,我認爲我可以更好地構建我的應用程序。 謝謝

回答

2

這些錯誤可能超出程序員的控制範圍,這是由一個隨機而平常的事件引起的。

一種方法是嘗試與錯誤以下前幾次:

def try_io(call, tries=10): 
    assert tries > 0 
    error = None 
    result = None 

    while tries: 
     try: 
      result = call() 
     except IOError as e: 
      error = e 
      tries -= 1 
     else: 
      break 

    if not tries: 
     raise error 

    return result 

try_io(lambda: bus.write_byte(0x48, 0)) 
2

的原因,這可能是你推了read/write電話比你更快的硬件可以接受。因此,在讀取/寫入操作之間添加小延遲:

from time import sleep 
from smbus import SMBus 

bus = SMBus(0) 

bus.write_byte(0x48, 0) 
sleep(0.2) # Wait for device to actually settle down 
lastval = -1 

while True: 
    reada = bus.read_byte(0x48) 
    if(abs(lastval-reada) > 2): 
    print(reada) 
    lastval=reada 
    sleep(0.2) # This might be not needed. 

另一種可能性是設備實際上並未出現在此地址中。因此,如果超時無效,請嘗試使用i2c工具(應通過軟件包管理提供,除非您使用的是自定義軟件分發版),以檢查設備是否真正可用(有時可能是一種佈線問題,如被遺忘GND):

i2cdetect -y [bus number] 

爲什麼選擇i2c?由於SMBus基本上是對i2c總線的更改,具有更嚴格定義的電壓等級和時序。

+1

i2cdetect程序是在這裏救了我。該設備位於不正確的地址。謝謝 – Youngy

0

我在RasPi - > ATMEGA通信中遇到了同樣的問題,我在從站上解決它。如果您的從站沒有響應,則會出現此錯誤消息。

我試圖上RasPi下面的代碼,與連接在I2C總線上,並配置成與位於0x8地址的I2C從設備:

從SMBus的進口的SMBus

I2C_Bus = SMBus的(1)

SLAVE_ADD = 0x8中

I2C_Bus.write_byte(SLAVE_ADD,和0xAA)

提供I2C從公配置爲acknowled ge,它應該工作!

9

原因可能是您正在遠程工作(SSH)。 斷開遠程會話後,您的程序仍然可以正常工作,並且可以嘗試打印或與控制檯交互,而控制檯已不再可用。這是發生在我身上的事情。

+0

瞭解,但你如何克服來解決這個問題。 – sib10

+0

我所做的就是使用'sudo username'來啓動這個過程,然後您可以註銷而不會中斷過程。希望這對你有所幫助。 – adimitrov

+1

nohup是克服這種情況的另一種方法... – sib10

2

雖然這個帖子已經老了,但我想分享我的意見,希望別人可以得到幫助,因爲我遇到的所有帖子都沒有提到這個潛在的修復方法。

我遇到了類似的問題,但使用不同的硬件(MCP23017和LCD)。

追問了一段時間後,我發現問題不是軟件,而是硬件問題。特別是SCL和SDA線上的上拉電阻。

RPI(我的情況是3)有1.8k電阻,我的LCD也有一些上拉電阻(~2.2k)。運行LCD從來沒有出現過問題,但MCP23017會隨機從總線上消失,並在發出命令「i2cdetect -y 1」進行掃描時再次出現。

移除液晶顯示屏上的額外上拉電阻可以解決這個問題,現在所有工作都完美無缺。

1

當使用b + rpi模型通過I2C驅動7-segment serial display時,我遇到了這個問題。通過調整波特率來匹配設備設置(9600),我糾正了這個問題。我相信,默認爲100000

要改變波特率,添加以下行/etc/modprobe.d/i2c.conf:

options i2c_bcm2708 baudrate=9600 

重新啓動後,我驗證的設置採取了效果與:

prompt$ sudo cat /sys/module/i2c_bcm2708/parameters/baudrate 
9600 

從那時起,我沒有間歇性I/O錯誤的問題。

0

我知道這個話題是相當古老的,但當我把值不在範圍內的值與I2C和PCA9685發生同樣的錯誤。我想它的方式是隻是簡單的禁用和啓用I2C:

  1. sudo raspi-config
  2. 「5。接口選項
  3. 'P5 I2C'
  4. '否'
  5. 'OK'
  6. sudo reboot now
  7. sudo raspi-config
  8. 「5。接口選項
  9. 'P5 I2C'
  10. '是'
  11. 'OK'
  12. sudo reboot now

之後,sudo i2cdetect -y 1再次檢測我的I2C PWM模塊。