IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

UART mémoire pleine ( raspberry python)


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut UART mémoire pleine ( raspberry python)
    bonjour à tous,

    voila je reçois d'un périphérique extérieure des paquets (115200 bps ) qui représente la distance entre le peripherique et l'obstacle en face, et je les recois sur ma raspberry via le port serie.
    les distances sont cohérentes, mais par exemple si je met ma main devant il faudra plusieurs secondes avant de me donner la nouvelle distance... j'espere que vous comprennez mon probleme car mon explication est peut etre pas trop clair...

    Je pense que le soucis viens de mon stockage d'octet de l'uart de ma raspberry qui est surchargé. ca expliquerait le temps d'attente pour la nouvelle distance, je ne peux pas arrété malheuresement le périphérique ou mettre un delay entre chaque envoie, non je recois tout en paquet... je dois donc trouver un moyen de vider la mémoire de de l'uart de ma raspberry pour recevoir les nouvelles donnees mais je ne sais pas comment faire ...

    avez vous une idée, je code python pour info
    voici mon extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import serial
    
    ser = serial.Serial('/dev/ttyAMAO',115200,timeout=5)
    reception=ser.read()
    merci d'avance

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 194
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Citation Envoyé par cosmoff Voir le message
    voici mon extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import serial
    
    ser = serial.Serial('/dev/ttyAMAO',115200,timeout=5)
    reception=ser.read()
    L'extrait de code est probablement trop raccourci. Lecture d'1 octet sur un port série avec un timeout de 5s (le timout est peut-être à l'origine du problème d'ailleurs), c'est tout ce qu'on peut lire... difficile de se faire une idée.

    Il faudrait aussi donner les références du capteur et décrire avec un exemple de ce qui est envoyé sur le port série (format des données).

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut re
    j'utilise un scanner laser RPlidar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    port=serial.Serial("\dev\ttyAMA0",115200,timeout = 1)
    port.write("\xa5\x20")#begins scanning
    
    [...]
    while True:
              line=""
              line= port.read(5)#on attend 5 octet
              if (len(line==5))  :
                        distance,angle=point_Polar(line)# la fonction nous retourne une distance et un angle 
                        print distance,angle
    je pense pas que le timeout soit le probleme car je recois bien les distances et angles mais le probleme est que mon programme est assez gros donc des que mon programme recois les paquets, le temps d'éxécuter les instructions pas mal de paquet vont etre en attente dans le buffer et donc je perd en rapidité, je sais pas si tu comprends mon probleme

    en faite je lis bien sur mon terminal les distances et angles environ 360 en 2 secondes mais si je met ma main devant le laser ca va afficher la distance laser-main qu'au bout de 10 secondes car la donnée distance laser-main est tres loin dans le buffer

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    C'est très bizarre ton problème.
    Quand tu écris "je lis bien sur mon terminal les distances et angles environ 360 en 2 secondes" ça me paraît déjà très lent, voir trop lent. Surtout avec un bauderate de 115900 bits/s.

    Dans la doc de ton scanner, il t'envoi combien d'octet par seconde ? Tu as un lien ?

  5. #5
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Par défaut
    http://rplidar.robopeak.com/download.html

    il n'est pas sur le net faut télécharger le SDK puis ensuite va dans doc/en.US/_interface_protocol

    sur la donc technique il m'envoie 115200 bauds soit 14400 octets par seconde

    je peux t'envoyer mon code complet si tu le desires

    j'ai utilisé la raspberry d'un ami avec 4 processeurs ( pour info j'ai la b+ avec 1 processeur) et je recois les données beaucoup beaucoup plus rapidement, ma raspberry B+ serait donc pas assez rapide ??

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Au vu de la doc ça devrait pédaler rapidement (si tu regardes les trames tu verras qu'elles ne sont pas énormes.)
    Est ce que tu as vu que dans rplidar_sdk_v1.4.5\sdk\app\ultra_simple\ tu as une application de démontration (en mode console) ?

    As tu essayé de compiler avec GCC ce source pour le tester avant de te lancer avec python ?

    Si non, peux tu commencer par là et nous faire un retour ?

    ps1 : je connaissais le principe de détection LIDAR mais je ne savais pas qu'il existait des modules tout fait ! Ca coûte cher ?
    ps2 : je ne connais pas encore assez bien le langage python pour trouver un problème dans ton code (quand j'étais dans l'électronique je ne faisais que du C et pour mes loisirs, je suis entrain d'apprendre JAVA et après je comptais passer à python.)

    A très vite.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Par défaut
    Salut,

    j'ai eu le "soucis" récemment pour un projet ou je recevais des données en continu par la liaison série sur laquelle je ne lisais que toutes les 10 secondes.
    moralité:
    - la première lecture était correcte.
    - la deuxième lecture qui intervenait 10 secondes plus tard me lisait en fait la trame qui était arrivée seulement quelques milisecondes après la première.
    - la 3e (au bout de 20 secondes) me lisait la 3e trame qui était arrivée très peu de temps après la premiere...
    - et ainsi de suite... plus le temps pasait, plus le décalage augmentait.

    je pense que tu as le même soucis et la solution est plutôt simple: l'écriture dans le buffer se faisant plus vite que la lecture de ce même buffer, il suffit de vider le buffer avant de faire une lecture pour avoir des données fraiches.
    regarde du coté des méthodes flush* de la classe Serial, ça devrait t'aider

Discussions similaires

  1. raspberry, python et com serie
    Par m_vincent dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 02/01/2014, 16h58
  2. Sage crystal report : export mémoire pleine
    Par helmiandrouu dans le forum SAGE
    Réponses: 0
    Dernier message: 08/03/2013, 11h38
  3. Comment augmenter la mémoire vive allouée à Python?
    Par syrius31 dans le forum Général Python
    Réponses: 19
    Dernier message: 28/03/2011, 16h20
  4. Création sémaphore et mémoire partagée python
    Par geek44 dans le forum Général Python
    Réponses: 2
    Dernier message: 10/05/2008, 03h00
  5. Out of memory avec plein de mémoire!
    Par JM-R dans le forum ASP.NET
    Réponses: 4
    Dernier message: 26/11/2007, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo