Problème de vitesse sur port série ?

Bonjour,
Je vous écrit aujourd'hui car j'ai un problème avec ma carte (UNO), j'ai besoin de lui envoyer un flux permanent de données par USB (actuellement toute les 25 ms, via un programme externe). La valeur de ce flux est 90, donc tout se passe à peu près bien sauf que par moment j'ai ceci:
90
90
90
9
0
0
0
90
90
...
Alors qu'absolument rien n'a été touché, ça doit venir d'un problème de vitesse de lecture de la carte peut-être ?
En fait j'aimerai savoir si quelqu'un a une idée sur ce problème ?

Mon programme externe envoie la donnée toute les 25ms et arduino fait une boucle avec un timer de 25ms aussi.

Merci d'avance !

Naphta:
arduino fait une boucle avec un timer de 25ms aussi.

Le programme pour que l'on puisse aider.

Ah oui désolé ^^

#include <Servo.h> 
 
Servo myservo;
 
int pos = 90;    // variable to store the servo position 
boolean sent;
void setup() 
{ 
  Serial.begin(9600);  
  myservo.attach(9);
} 
 
 
void loop() 
{  //Point d'equilibre : 90
  sent=true;
  while(Serial.available() > 0) {
    if(sent){ pos=0; }
    switch(Serial.read()){
      case '0': pos = pos*10+0;break;
      case '1': pos = pos*10+1;break;
      case '2': pos = pos*10+2;break;
      case '3': pos = pos*10+3;break;
      case '4': pos = pos*10+4;break;
      case '5': pos = pos*10+5;break;
      case '6': pos = pos*10+6;break;
      case '7': pos = pos*10+7;break;
      case '8': pos = pos*10+8;break;
      case '9': pos = pos*10+9;
    }
    sent=false;
  }
  Serial.println(pos);
  myservo.write(pos);
  delay(25); 
}

Edit : Pour le code côté programme externe, imaginez juste une boucle banale comme ceci :

boucle(Event){
     //Traitement de l'event
     ecrire sur le port de l'arduino: "90";
     timer(25);
}

Avant de rentrer dans ta boucle, mets une condition + un delay() :

if(Serial.available()) {
delay(20);
while(Serial.available()) {
...

Alors là ! Je suis bluffé ! C'était exactement ça mon problème :slight_smile:

Mais du coup il me reste un autre soucis (si jamais tu repasses par ici, sinon je ferai un autre post au besoin) :

Des fois au lieu d'interpreter le nombre (par exemple) 126, il va interpreter 12 puis 6 (en gros il va couper le nombre à 3 chiffres), as-tu une idée d'où celà peut venir ?

Sinon merci beaucoup pour mon problème de base :slight_smile:

A mon avi ton Arduino et ton programme externe ne sont pas synchroniser, ce qui a tendance a couper ton nombre,
tu devrais instaurer un système de top pour signaler quand lire le nombre.

Naphta:
Alors là ! Je suis bluffé ! C'était exactement ça mon problème :slight_smile:

Oui et non. Ton problème c'est que lorsque tu arrives à la fin de ton while rien ne te garantie que le caractère suivant est déjà arrivé.
Tu as entrevue le problème puisque tu as une variable (sent) qui t'indique si tu commences une réception ou non.
En plus des fois tu envoies des nombre à 2 chiffres et d'autre fois des nombres à 3 chiffres. Comment ton code peut-il savoir quand s'arrêter?
Il faut mettre en place un protocole de communication.
Il te faudrait un code qui indique le début d'une trame de données. La réception de ce code positionnerait pos à 0.
Ensuite tu accumules les caractères reçus comme tu le fais actuellement.
Un code de fin de trame de données ferait sortir du while et interpréter la nouvelle valeur.

Un protocole plus simple pourrait éventuellement se passer du code de début de trame. La réception du code de fin validant la donnée et remettant pos à 0. Dans ce cas le premier transfert pourrait être tronqué.

Bonjour,

Vire ce delay et utilise Serial.parseInt, ton code sera plus simple et le probléme de syncro devrait disparaitre.

void loop() {  
  int pos = Serial.parseInt()
  Serial.println(pos);
  myservo.write(pos);
}