Bonjour à tous,
Voilà maintenant plusieurs semaines en stage où je dois gérer 2 projets dont l'un où je dois réaliser un programme, sous python, qui vise à lire des codes barres à l'aide d'un lecteur GFS4470 de chez datalogic connecté via USB à une Raspberry Pi 3. Lorsque je fais fonctionner le lecteur uniquement, j'obtiens la valeur scannée sans trop de difficulté, le problème est qu'en parallèle (ou asynchrone) je dois transmettre des informations à un afficheur (via modbus) et à une API (USB).
Or, lorsque je demande la lecture de code barre( fonction contenant une instruction .read() ) celui-ci attend indéfiniment d'avoir quelque chose a se mettre sous la dent que ce soit un "bon" ou un "mauvais" code barre. Tant qu'il n'a rien lu, impossible de poursuivre le programme et de dépasser l'instruction ".read".
J'ai effectué de nombreuses recherches et essais (en essayant différents modes du scanner) j'ai notamment découvert l'existence des threads, du multitasking, des librairies evdev, asyncio(en passant ma RPi de pyton 2.7 à 3.7), asynchore et select.
Ce que j'en ai conclu :
- Asyncio ne me permet pas de "passer" l'instruction bloquante "d'attente de lecture" (pourtant il me semblait que le but d'une librairie ASYNChronous Input Output était de gérer les entrées/sorties des périphériques ???)
- Asynchore est un ancêtre d'Asyncio, plus fonctionnel depuis python 3.4
- le multitasking n'est pas possible sur RPi car cela nécessite processeurs
- le multithread doit être possible mais cela semble assez technique et potentiellement contournable
- par la librairie .select entre autres mais je ne comprends pas trop comment la mettre en place
- evdev gère des évènements de type souris ou clavier en parallèle au programme; mais je n'obtiens rien de pertinent même en configurant mon lecteur de code barre en mode clavier (plusieurs modes, en français/anglais) impossible de récupérer des informations de lectures comme des interruptions, mais je vois souvent cette librairie utilisée avec select (dont je rappelle j'ai du mal à saisir le fonctionnement)
Voilà, j'ai essayé de multiples méthodes et malheureusement mon instruction .read reste bloquante et toutes les autre méthodes que j'ai pu tenter m'ont laissé sans résultats, je précise que jusqu'alors ma connaissance de python se résumait aux tableaux et à tkinter autant dire quasi nulle
Si vous avez des explications/idées/solutions à m'apporter je suis preneur, il me reste un peu moins de 3 semaines et là je ne vois plus comment faire.. Je sais c'est court pour espérer une réponse mais je tenais vraiment à trouver une solution par moi même...
Merci d'avance pour vos retours
-----