Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino - Problème de buffer du port série

Sujet résolu
    13 janvier 2019 à 16:09:59

    Bonjour à tous 

    Je suis nouveau sur le forum et je suis actuellement en train de réaliser un projet : commander un axe d’imprimante avec une arduino.

    Pour faire court j'envoie un entier compris entre 0 et 2000 et l'axe se déplace vers la bonne valeur.

    Pour ce projet j'ai besoin de changer ces valeurs via le port série avec un temps de réponse assez court en utilisant python. Mon problème est le buffer du port série : si je lui envoie par exemple 1000 puis 2000 (je fais une conversion ascii) le programme interprète cela comme une coordonnée de 10002000 et pas 2000 (et je ne peux pas faire de réinitialisation à 0 car l'axe se déplacerait)

    Voilà mes codes

    Python :

    from serial import Serial
    serial_port = Serial(port='/dev/ttyACM0', baudrate=115200) #je prend 115200 bauds pour avoir le meilleur tps de réponse
    
    
    while True:
        nombre = input('Entrez un entier : ')
        serial_port.write(nombre.encode('ascii'))

    arduino :

    void loop() {
    
    while ( Serial.available()) {
         byte_read = Serial.read();
         recieved_integer = ascii2int(recieved_integer, byte_read); //fonction définie avant qui transforme l'ascii en entier
       }
    
       
    target=recieved_integer;
    driveTo(target); //fonction qui commande le moteur pour aller au bon endroit
    Serial.println(target);
    delay(100);
    
    }


    Merci par avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      Staff 13 janvier 2019 à 20:50:08

      Coté PC, il y a la fonction flush pour forcer le système d'exploitation à vider le buffer.

      serial_port.write(nombre.encode('ascii'))
      serial_port.flush()

      Par contre, cela ne supprimera pas forcément tous tes problèmes puisque l'inverse peut aussi ce produire.

      Par exemple, si tu demandes à envoyer 1234, il se peut très bien que tu reçoive d'abord 12 puis 34 un peu plus tard.

      Pour bien faire, il faudrait utiliser un délimiteur, un point virgule ou un saut de ligne par exemple.

      Pour envoyer 1234, il faudrait donc envoyer 1234;

      Ainsi, si l'arduino reçoit 12, il sait que le nombre n'est pas encore totalement reçu car il n'a pas encore reçu le point virgule.

      ***

      Je m’interroge aussi si la présence de ton delay...

      D'un coté tu nous dis avoir besoin d'aller très vite.

      Et de l'autre, tu rajoutes un delay de 100ms qui vient plomber toute réactivité...

      -
      Edité par lorrio 13 janvier 2019 à 20:51:20

      • Partager sur Facebook
      • Partager sur Twitter
        14 janvier 2019 à 23:35:23

        Merci beaucoup pour ta réponse j'ai effectivement utiliser la méthode avec deux délimiteur avant et après l'entier.

        Pour info j'ai pris ce programme : http://forum.arduino.cc/index.php/topic,99225.0.html

        et ai évidemment enlever le delay 

        • Partager sur Facebook
        • Partager sur Twitter

        Arduino - Problème de buffer du port série

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown