Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Ballon sonde
#1
Bonjour,

J'aurai aimé solliciter votre aide pour mon projet de ballon sonde. http://lyzda.be/ballon-stratospherique/

Bien-sur l’élément principale est un Rpi modèle 2. Plusieurs capteurs sont branché dessus ( température, pression, gps ) ainsi qu'un émetteur radio permettant de recevoir les coordonnées gps en plein vol.
Le script tourne sur Python.

J'ai un bug que je n'arrive pas à résoudre malgré mes nombreuses recherches.
Les données sont envoyé par radio via un convertisseur usb => série, j'utilise la librairie Pyserial pour cela.

Mon bug le voici: Après l'envois de 126 trames le script s’arrête avec ceci comme message:

Code :
[== Indéfini ==]
Trame 126 |__Ballon__|10:40| GPS: 50 22 xx, 04 27 xx| Sat: 08| Alt: 195.3| T_in = 17.3| T_ex = 17.6

Traceback (most recent call last):
  File "telemetryP4.py", line 215, in <module>
    send(datastring)

  File "telemetryP4.py", line 130, in send
    NTX2.write(data.encode())
  File "/usr/lib/python2.7/site-packages/serial/serialposix.py", line 515, in write
    abort, ready, _ = select.select([self.pipe_abort_write_r], [self.fd], [], None)
ValueError: filedescriptor out of range in select()


Et voici le morceau de code qui posse problème :

Code :
[== Indéfini ==]
def send(data):
    try:
        NTX2 = serial.Serial('/dev/ttyUSB0', 200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_TWO)
        NTX2.write(data.encode())
        print data
        NTX2.close()
    
    except:
        print("Erreur NTX2")

    finally:
        NTX2.close()

Ce que je ne comprends pas c'est que après chaque envoie je ferme ma liaison série NTX2.close() donc pas de fichier ouvert.
J'ai déjà tenté d'augmenter le nombre de fichier ouvert avec "ulimit -n" mais cela ne change rien.....

Si quelqu'un à une piste?

Merci
Répondre
#2
D'après ce qui est dit sur https://bugzilla.redhat.com/show_bug.cgi?id=609020, le souci ne vient pas de ton code mais de celui de serialposix.py et plus particulièrement de l'utilisation de select.
Citation :This was due to the subprocess module using the "select" system call. The module now uses the "poll" system call, removing this limitation.

Il faudrait voir s'il existe une version plus récente de cette library, ou bien la modifier.
Répondre
#3
Merci pour les infos CrazyCat.

J'ai trouvé une solution qui résous mon bug temporairement.

J'ai simplement supprimé ma librairie Pyserial et je l'ai réinstallé cette fois ci par "yum install pyserial" et je n'ai plus l'erreur : filedescriptor out of range in select() et mon script tourne non stop! Big Grin

Par contre j'ai quand même une erreur lors de l'arrête du script : OSError: [Error 9] Bad file descriptor

A investiguer!

Merci
Répondre
#4
Ca peut très vraisemblablement venir d'une tentative d'accès ou de fermeture sur un fichier/socket fermé. Est-ce que tu n'aurais pas un .close() à la fin de ton script qui s'exécuterait dans tous les cas ?
Répondre
#5
Oui en effet, voici une partie du code en question:
Code :
[== Indéfini ==]
#--------------- Envoi des donnees par radio NTX2 ----------------------

def send(data):
    try:
        NTX2 = serial.Serial('/dev/ttyUSB0', 200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_TWO)
        NTX2.write(data.encode())
        print data
        NTX2.close()
    
    except:
        print("Erreur NTX2")

    finally:
        NTX2.close()


Est-ce que je dois supprimer les deux NTX2.close() ?
Répondre
#6
Je virerais celui du finally, tu n'ouvres le fichier que dans le try
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)

A propos de Communauté francophone RPi

Communauté francophone RPi est un forum d'aide et de partage autour du Raspberry Pi et des micro-ordinateurs.