ERREUR 9 BAD FILE DESCRIPTOR

Bonjour à tous,
Me voila de retour pour un nouveau problème que je ne parviens pas à résoudre…
Une erreur N°9 Bad file descriptor. Je ne sais pas d’ou cela peut provenir mais ca se passe a priori dans l’I2C…
Voila mon code

from pyA20 import i2c

def setup():
#*******************************************
#*					I2C
#*******************************************
	i2c.init("/dev/i2c-2")
	i2c.open(0x02) # Adresse esclave
	i2c.close() #End communication with slave device


#*******************************************
#*				BOUCLE I2C
#*******************************************
#fonction Todo1 - autorappel par timer dedie
def Todo1(): # I2C
	print(".") # temoin passage 2emeBoucle
	
	
	Reception_Donnees_I2C() 	# Recoit les donnees des capteurs esclaves
	
	Calculs_Lumieres() 	 # Prends les 3 variables (Reconnaissance_Vocale + Site_Web + Bp) et les convertis en telerupteurs
	
	Envoi_Infos_I2C() 	# Envoi trame I2C vers les relais
	
	
	timer(250, Todo1) # auto appel de la fonction Todo1
#-- fin Todo1


def Calculs_Lumieres():


	global Etat_A_Relayer_Lum_Entree, Etat_A_Relayer_Lum_Couloir, Etat_A_Relayer_Lum_Sejour
	global Etat_A_Relayer_Lum_Cuisine, Etat_A_Relayer_Lum_Salon, Etat_A_Relayer_Lum_CH1
	global Etat_A_Relayer_Lum_CH2, Etat_A_Relayer_Lum_Bureau, Etat_A_Relayer_Lum_SdB
	global Etat_A_Relayer_Lum_Cave, Etat_A_Relayer_Lum_Garage, Etat_A_Relayer_Lum_Atelier1
	global Etat_A_Relayer_Lum_Atelier2, Etat_A_Relayer_Lum_Dispo1
        global Etat_A_Relayer_Lum_Dispo2 
	global Etat_A_Relayer_Lum_Tout_Eteindre, Etat_A_Relayer_Lum_Tout_Alumer

        i2c.open(0x02) #The slave device address is 0x02

	if Etat_A_Relayer_Lum_Entree == 1:
		i2c.write([0xC9]) # Active le relais 1
	else:
		i2c.write([0xC8]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Couloir == 1:
		i2c.write([0xCB]) # Active le relais 1
	else:
		i2c.write([0xCA]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Sejour == 1:
		i2c.write([0xCD]) # Active le relais 1
	else:
		i2c.write([0xCC]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Cuisine == 1:
		i2c.write([0xCF]) # Active le relais 1
	else:
		i2c.write([0xCE]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Salon == 1:
		i2c.write([0xD1]) # Active le relais 1
	else:
		i2c.write([0xD0]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_CH1 == 1:
		i2c.write([0xD3]) # Active le relais 1
	else:
		i2c.write([0xD2]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_CH2 == 1:
		i2c.write([0xD5]) # Active le relais 1
	else:
		i2c.write([0xD4]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Bureau == 1:
		i2c.write([0xD7]) # Active le relais 1
	else:
		i2c.write([0xD6]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_SdB == 1:
		i2c.write([0xD9]) # Active le relais 1
	else:
		i2c.write([0xD8]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Cave == 1:
		i2c.write([0xDB]) # Active le relais 1
	else:
		i2c.write([0xDA]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Garage == 1:
		i2c.write([0xDD]) # Active le relais 1
	else:
		i2c.write([0xDC]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Atelier1 == 1:
		i2c.write([0xDF]) # Active le relais 1
	else:
		i2c.write([0xDE]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Atelier2 == 1:
		i2c.write([0xE1]) # Active le relais 1
	else:
		i2c.write([0xE0]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Dispo1 == 1:
		i2c.write([0xE3]) # Active le relais 1
	else:
		i2c.write([0xE2]) # Desactive le relais 0

	if Etat_A_Relayer_Lum_Dispo2 == 1:
		i2c.write([0xE5]) # Active le relais 1
	else:
		i2c.write([0xE4]) # Desactive le relais 0

	i2c.close() #End communication with slave device

En fait, je récupère le résultat d’un calcul binaire et je l’envoi, depuis le pcduino vers l’arduino en I2C si le relais est activé ou pas…

Mais j’ai cette fichue erreur qui me plante ma com I2C.

Pouvez vous me conseiller, m’aider ou encore mème reprendre mon code afin de résoudre le problème ?

Merci d’avance

@ Bientot

Vous pouvez nous donner des détails sur la plateforme? C'est du python sur un ordinateur? Un raspberry? Ça ne semble pas trop lié à l'Arduino ?

Bonsoir, Alors, détaillons un peut plus le projet... Il s'agit d'un pcduino qui tourne sous ubuntu et avec une librairie python pour la programmation, relié à une arduino MEGA 2560 par l'I2C et à un autre mini pc pour la reconnaissance vocale par le port série qui lui tourne sur Windows 10. Tout ceci va former une plateforme de domotique qui va gérer, les lumières des pièces,une dizaine de prises radiocommandées, l'alarme, les volets roulants et de multiples capteurs d'environnement afin de contrôler le chauffage et la fermeture des volets... Je retombe sur le problème décrit ci dessus, et je ne comprend pas d’où il vient...

J'ai eu ça récemment. J'ai réglé le problème en réécrivant mon programme en C++. Ca ne va pas aider beaucoup.

Plus sérieusement, je ne sais pas ce qui a causé le problème dans mon cas, mais je sais quand il est apparu: lors d'une réinstallation de mon système d'exploitation. Avant: pas de problème; après: problème. En l’occurrence chez moi l'erreur pointait sur je ne sais plus quelle bibliothèque, il me semble que c'était lié à un conflit de version, avec un bibliothèque python 2 alors que mon application était en python 3. Le fait que ce soit apparu (chez moi) suite à une réinstallation me fait penser que ce doit être lié à une dépendance...

Ok - un peu loin de l'Arduino, il y a sans doute moins de personnes expérimentées ici sur cette architecture.

Vous êtes sûr de votre /dev/i2c-2 ?

oui, sur pour /dev/i2c-2, ca marche quand même mais par moment j'ai cette erreur... Si je viens sur le site arduino pour mon pcduino, c'est que les autres forums dédiés a pcduino ou python, il n'y a personnes qui répond... Ici, dans mon cas, le pcduino est une carte arduino, certes il y a du python mais j'ai déjà obtenu ici de l'aide pour avancer... surtout que j'arrive au final du projet... reste à faire quelques schémas, quelques options à ajouter, mais presque tout est sur banc de test chez moi et ca marche... La plus grosse partie qui me reste est l'interface graphique avec courbes, compteurs, thermomètre... Chaque choses en sont temps... Merci en tout cas de me repondre... @ Bientot

je pense que ca peux aider un peu /dev/i2c-2

EDIT tu peux donner le résultat de i2cdetect -l si erreur sudo apt-get install i2c-tools

Bonjour, Voila la réponse:

i2c-0   i2c          sun4i-i2c.0                       I2C adapter
i2c-1   i2c          sunxi-hdmi-i2c                     I2C adapter
i2c-2   i2c          sun4i-i2c.2                       I2C adapter

Je lis le document et reviens vers vous si problème.

Merci

@+

i2c-0 ===>carte mère donc reste 1 et 2

tu as quoi de connecté en I2c, mis à part la liaison

I2C 0 = I2C Carte mere I2C 1 = I2C HDMI video I2C 2 = I2C for SDA/SCL Fonction...

Le document joint parle de SMBus alors que moi j'utilise pyA20, librairie en python, alors que SMBus est en C...

J'ai également un petit problème sur l'envoi / réception d'un flux de données I2C. Je pense que cela doit être lié...

Depuis l'arduino MEGA 2560, je récupère des variables en 0 ou 1 et je les transmets via l'I2C sur requete du maitre, du coté arduino en mettant des serial print, je vois bien mes données en 0 ou 1 apparaitre mais du coté PcDuino, avec les print, je vois par moment des 1 et par moment des 255... Ces 255 bloque mon code qui lui s'attend a recevoir des 1... J'ai peux etre oublié quelque chose, si tu peux regarder mon code, se serait sympa...

code coté Arduino

#define Nombre_Octets_A_Recevoir 18

  byte Data[Nombre_Octets_A_Recevoir];

void setup
{
  Wire.begin(Adr_PCB_Relayage);        // Active I2C en esclave
  Wire.setClock(200000L); // Configure la vitesse a 200 kHz comme le PcDuino
//  TWBR = 32; // Configure l'I2C a 200 kHz
  Wire.onReceive(receiveEvent); // register event
  Wire.onRequest(requestEvent); // register event
}

void requestEvent() // If read = ...
{
  Data[0] = Hydrometrie;
  Data[1] = Temperature; 
  Data[2] = Luminosite;
  
  Data[3] = Etat_Bp_Lum_Entree;
  Data[4] = Etat_Bp_Lum_Couloir;
  Data[5] = Etat_Bp_Lum_Sejour;
  Data[6] = Etat_Bp_Lum_Cuisine;
  Data[7] = Etat_Bp_Lum_Salon;
  Data[8] = Etat_Bp_Lum_CH1;
  Data[9] = Etat_Bp_Lum_CH2;
  Data[10] = Etat_Bp_Lum_Bureau;
  Data[11] = Etat_Bp_Lum_SdB;
  Data[12] = Etat_Bp_Lum_Cave;
  Data[13] = Etat_Bp_Lum_Garage;
  Data[14] = Etat_Bp_Lum_Atelier1;
  Data[15] = Etat_Bp_Lum_Atelier2;
  Data[16] = Etat_Bp_Lum_Dispo1;
  Data[17] = Etat_Bp_Lum_Dispo2;

  Wire.write(Data,Nombre_Octets_A_Recevoir);
}

Code coté Pcduino

value=1
Nombre_Octets_A_Recevoir =18
value=[Nombre_Octets_A_Recevoir]


def Reception_Donnees_I2C():

    global Hydrometrie, Temperature, Luminosite, value

    i2c.open(0x02) #The slave device address is 0x02

    value = i2c.read(Nombre_Octets_A_Recevoir) # 18#Read 3 bytes # H + T + L + Bp 1 a 15

    i2c.close() #End communication with slave device

    print str(value[0]) , str(value[1]) , str(value[2]) , str(value[3]) , str(value[4]) , str(value[5])   , str(value[6]) , str(value[7]) , str(value[8]) , str(value[9]) , str(value[10]) , str(value[11]) , str(value[12]) , str(value[13]) , str(value[14]) , str(value[15]) , str(value[16]) , str(value[17])

Une autre question, a chaque appel de la fonction I2C, dois je réinitialiser l'I2C de la manière suivante ou cela n'est pas la peine ??

    i2c.init("/dev/i2c-2") #Initialize module to use /dev/i2c-2
    i2c.open(0x02) #The slave device address is 0x02

ou juste

    i2c.open(0x02) #The slave device address is 0x02

Merci d'avance

@+

je te conseille de passer par le smbus https://learn.sparkfun.com/tutorials/programming-the-pcduino/i2c-communications

Je vais essayer, je reviens après la modif... Merci

@+

Des erreurs sont present, j'investigue et reviens...

arnaudf09: Des erreurs sont present, j'investigue et reviens...

c'est a dire?

Zut, l'imprime ecran ne passe pas, on ajoute comment une image ???

copie colle le texte, c'est plus simple

le probleme est que je suis en acces distant et le terminal me liste pas mal d'info donc je dois faire un imprime ecran tres rapide... comment on met une image, tu sais ??? merci

global name 'read_byte_data' is not defined

comment on met une image, tu sais ???

au lieu de taper dans quick reply, tu vas dans reply et attachments and other options

la 2eme:

viens d’un fichier smbus/utility.py…

raise typeError("Expected %s" % name)
type error: Expected integer