2017-10-24 12 views
0

안녕하세요 저는 라스베리 파이 3에 끔찍한 코드가 있습니다. 4 RC522 모듈을 읽으려고합니다. 하지만 몇 분 후에 "장치를 열 수 없습니다 : 너무 많은 파일 열기"오류가 발생하고 while 루프가 종료되었습니다.장치를 열 수 없습니다. 열려있는 파일이 너무 많습니다. 오류

나는 모든 기능을 공유하지 않았다. 중요한 부분은 while loop입니다. 모든 루프마다 인스턴스를 만듭니다. 나는 이것이 큰 실수라고 생각한다. 나는 딜레이를 더할 수 없다. 내 개체에 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()이 호출되지만 절대로 닫히지 않습니다. 이 파이썬 라이브러리는 단일 인스턴스에 적합하지만 FD가 열리는 여러 인스턴스를 처리 중이므로 spi.closeSPI()을 사용하여 닫을 필요가 있습니다. 그렇지 않으면 "너무 많은 오픈 FD"오류가 발생합니다.

open FDs이 PID에 몇 개 있는지 확인하십시오.

+0

closeSPI 함수가 없습니다 : ( –

+0

죄송합니다, closeSPI 함수가 spi 라이브러리에 있습니다. 자연스럽게 죄송합니다 :) 감사합니다. –

+0

도움이 될 경우 투표를 포기할 수 있습니까? 감사 :) –