2017-10-24 5 views
0

こんにちは私はラズベリーパイ3にひどいコードがあります。私は4 RC522モジュールを読み込もうとしています。しかし、数分後に私は "デバイスを開くことができません:開いているファイルが多すぎます"というエラーが表示され、whileループが終了しました。デバイスを開くことができません:開いているファイルが多すぎますエラー

私はすべての機能を共有しませんでした。重要な部分はwhileループだと思います。私はすべてのループでインスタンスを作成します。私はこれが大きな間違いだと思います。私は遅延を追加することはできません。私はオブジェクトにnullを割り当てようとしましたが、私は同じエラーがまだあります。私のコードは以下の通りです

注:私は4つのSPIアドレスを持っており、それらを使用してインスタンスを作成します。

#!/usr/bin/env python 
# -*- coding: utf8 -*- 
import time 
import sys 
import os 
import RPi.GPIO as GPIO 
import MFRC522 
import signal 
from time import gmtime, strftime 
from time import sleep 
import requests 
#import xml.etree.ElementTree as ET 
#import xmltodict, json 
from lxml import objectify 
from bs4 import BeautifulSoup 
continue_reading = True 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7, GPIO.OUT) 
GPIO.setup(37, GPIO.OUT) 
GPIO.setup(13, GPIO.OUT) 
GPIO.setup(15, GPIO.OUT) 

# Capture SIGINT for cleanup when the script is aborted 
def end_read(signal,frame): 
    global continue_reading 
    print "Ctrl+C captured, ending read." 
    continue_reading = False 
    GPIO.cleanup() 

kullanici = "xxxx" 
sifre = "xxxx" 
birim = "xxxx" 
ogrKEY = " " 


def end_read(signal,frame): 
    global continue_reading 
    print "Ctrl+C captured, ending read." 
    continue_reading = False 
    GPIO.cleanup() 


# Hook the SIGINT 
signal.signal(signal.SIGINT, end_read) 

# Create an object of the class MFRC522 
# 
adresler = ["/dev/spidev0.0", "/dev/spidev0.1", "/dev/spidev1.0","/dev/spidev1.1"] 

# Welcome message 
print "Welcome to the MFRC522 data read example" 
print "Press Ctrl-C to stop." 
j = 0 
# This loop keeps checking for chips. If one is near it will get the UID and authenticate 
while continue_reading: 
    MIFAREReader = None 
    pin = 0 
    if j == 100: 
     j = 0 
    i = j % 4 

    if i == 0: 
    MIFAREReader = MFRC522.MFRC522(adresler[0], 16) 
     pin = 15 
    elif i == 1: 
    MIFAREReader = MFRC522.MFRC522(adresler[1], 18) 
     pin = 13 
    elif i == 2: 
     MIFAREReader = MFRC522.MFRC522(adresler[2], 33) 
     pin = 7 
    else: 
     MIFAREReader = MFRC522.MFRC522(adresler[3], 31) 
     pin = 37 


    # Scan for cards 
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) 

    # If a card is found 
    if status == MIFAREReader.MI_OK: 
     print "Card detected" 

     # Get the UID of the card 
     (status,uid) = MIFAREReader.MFRC522_Anticoll() 

     # If we have the UID, continue 
     if status == MIFAREReader.MI_OK: 
       # print "su okuyucudan okundu" % i 
      # Print UID 
      print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]) 

      # This is the default key for authentication 
      key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] 
      # Select the scanned tag 
      MIFAREReader.MFRC522_SelectTag(uid) 

      # Authenticate 
      status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 10, key, uid) 

      # Check if authenticated 
      if status == MIFAREReader.MI_OK: 
       MIFAREReader.MFRC522_Read(10) 
      ogrKEY = MIFAREReader.returnOGR() 
        sonuc = parser(ogrKEY) 
        if sonuc == True: 
      openTurnsTile(pin) 
        else: 
      sonuc = personelKontrol(ogrKey) 
         if sonuc == True: 
       openTurnsTile(pin) 
       MIFAREReader.MFRC522_StopCrypto1() 
      else: 
       print "Authentication error" 
    j = j + 1 

答えて

0

MFRC522オブジェクトを作成すると、実際にはspi.openSPI()が呼び出されますが、決して閉じません。このPythonライブラリは単一のインスタンスには適していますが、FDがオープンされている複数のインスタンスを扱っているので、spi.closeSPI()を使用して閉じておく必要があります。そうしないと、 "Too many open FDs"というエラーが発生します。

open FDsがあなたのPIDにいくつあるかチェックしてください。

+0

closeSPI関数がありません:( –

+0

申し訳ありませんが、closeSPI関数はspiライブラリにあります。 –

+0

これが役に立ったら、投票を断念できますか?ありがとう:) –

関連する問題