2015-05-19 14 views
6

के माध्यम से एनालॉग पढ़ने के लिए एसएमबीस का उपयोग करते समय मैं शीर्षक में उल्लिखित त्रुटि के उत्तर की तलाश कर रहा हूं लेकिन पहली बार मुझे अभी तक एक जवाब मिला है। हम अपने रास्पबेरी पीआई को एनालॉग डेटा पढ़ने की कोशिश कर रहे हैं, लेकिन जब मैं टर्मिनल विंडो में कोड चलाता हूं तो यह मुझे 'IOError: [Errno 5] इनपुट/आउटपुट त्रुटि' देता है।'IOError: [Errno 5] इनपुट/आउटपुट त्रुटि' आरपीआई

एनालॉग डेटा पढ़ने के लिए उपयोग करने वाला कोड नीचे दिखाया गया है। मैं पीसीएफ 85 9 1 एडीसी कनवर्टर का उपयोग कर।

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)। इसके लिए मैंने अपने आरपीआई संस्करण की जांच की जो संशोधित नहीं है। लेकिन फिर भी मैंने 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-tools (पैकेज प्रबंधन के माध्यम से उपलब्ध होना चाहिए), जब तक कि आप वास्तव में उपलब्ध नहीं हैं (कभी-कभी यह एक तारों की समस्या हो सकती है जीएनडी):

i2cdetect -y [bus number] 

क्यों i2c? चूंकि एसएमबीयूएस मूल रूप से i2c बस का एक संशोधन है जो अधिक कड़ाई से परिभाषित वोल्टेज स्तर और समय के साथ है।

+1

i2cdetect प्रोग्राम मुझे यहां सहेजा गया है। डिवाइस गलत पते पर था। धन्यवाद – Youngy

0

मुझे रास्पी -> एटीएमईजीए संचार में एक ही समस्या थी और मैं इसे गुलाम पर हल करता हूं। यह त्रुटि संदेश तब होता है जब आपका दास प्रतिसाद नहीं देता है।

मैं RasPi पर निम्नलिखित कोड की कोशिश की, एक I2C I2C बस में जुड़ा हुआ है और 0x8 पते के साथ विन्यस्त दास के साथ:

SMBus आयात SMBus

I2C_Bus = SMBus (1)

से

SLAVE_ADD = 0x8

I2C_Bus.write_byte (SLAVE_ADD, 0xAA)

I2C दास प्रदान करना अच्छी तरह से acknowled के लिए कॉन्फ़िगर है जीई, यह काम करना चाहिए!

9

इसका कारण यह हो सकता है कि आप दूरस्थ रूप से काम कर रहे हैं (एसएसएच)। रिमोट सत्र डिस्कनेक्ट करने के बाद, आपका प्रोग्राम अभी भी काम कर रहा है और कंसोल को प्रिंट या इंटरैक्ट करने का प्रयास कर सकता है, जो अब उपलब्ध नहीं है। मेरा साथ ऐसा ही हुआ था।

+0

समझा, लेकिन इस मुद्दे को हल करने के लिए आप कैसे उबर गए। – sib10

+0

मैंने प्रक्रिया शुरू करने के लिए 'सूडो उपयोगकर्ता नाम' का उपयोग करने के लिए क्या किया है, फिर आप प्रक्रिया को इंटरप्ट करने में श्वेतआउट लॉगआउट कर सकते हैं।उम्मीद है कि यह आपकी मदद करेगा। – adimitrov

+1

नोहप इस स्थिति को दूर करने का एक और तरीका है ... – sib10

2

जबकि यह धागा पुराना है, मैं अपनी पूरी तरह से उम्मीद करना चाहता हूं कि किसी और की मदद की जा सकती है क्योंकि मेरे द्वारा आने वाली सभी पोस्टों में इस संभावित फिक्स का उल्लेख नहीं किया गया था।

मुझे एक समान समस्या का सामना करना पड़ रहा था, लेकिन विभिन्न हार्डवेयर (एमसीपी 23017 और एलसीडी) के साथ।

कुछ समय के लिए समस्या का पीछा करने के बाद, मुझे पता चला कि समस्या सॉफ्टवेयर नहीं बल्कि हार्डवेयर है। विशेष रूप से एससीएल और एसडीए लाइनों पर पुल अप प्रतिरोधक।

आरपीआई (मेरे मामले में 3) में 1.8k प्रतिरोधक हैं और मेरे एलसीडी में कुछ पुल अप प्रतिरोधक भी स्थापित हैं (~ 2.2k)। एलसीडी चलाने में कोई समस्या नहीं थी, लेकिन एमसीपी 23017 बस से यादृच्छिक रूप से गायब हो जाएगा और "i2cdetect -y 1" आदेश जारी करके स्कैन चलाते समय फिर से दिखाई देगा।

एलसीडी पर अतिरिक्त पुल अप प्रतिरोधकों को हटाने से समस्या ठीक हो गई है और अब पूरी तरह से काम करता है।

1

मुझे मॉडल बी + आरपीआई के साथ 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 के साथ एक ही त्रुटि आई जब मैंने मूल्यों को नहीं रखा था।

  1. sudo raspi-config
  2. '5: तरह से मैं यह समझ से बाहर बस अक्षम और I2C सक्षम करने गया था। इंटरफ़ेस विकल्प '
  3. ' पी 5 I2C '
  4. ' नहीं '
  5. ' ठीक है '
  6. sudo reboot now
  7. sudo raspi-config
  8. ' 5। इंटरफ़ेस विकल्प '
  9. ' पी 5 I2C '
  10. ' हाँ '
  11. ' ठीक है '
  12. sudo reboot now

उसके बाद, sudo i2cdetect -y 1 वापस फिर से मेरी I2C PWM मॉड्यूल का पता लगाता है।

संबंधित मुद्दे