Détection automatique baud rate

Bonjour,

Je cherche à venir détecter automatique le baud rate présent sur le port série 3 d'une carte Arduino Mega 2560. J'ai besoin d'adapter ce débit pour venir lire les trames d'un appareil qui peut transmettre à 9600 bauds ou 1200 bauds. Pour cela j'initialise dans la fonction void setup() de mon programme le baud rate avec la commande
Serial3.begin(9600) (ou 1200), le problème c'est que je dois retoucher cette valeur à chaque fois que le baud rate de la source change, et j'aimerais automatisé cette détection.

Ce que j'ai essayé pour l'instant suite à la lecture de plusieurs sujets similaire :

  • Utiliser la fonction pulseIn pour lire les durées de plusieurs pulsation (états haut et bas testés), déterminer la durée min, en déduire la vitesse de transmission :
  • J'ai également essayé d'initialiser au début de la fonction setup() à 9600, je viens lire le port Série, si je j'arrive à lire une trame, je reste à 9600 sinon je passe à 1200, cela ne fonctionne pas non plus.

Avez-vous des idées ?

Merci.

long duree[10];
long dureeMini;
long baud;
long baudRate;

char ligne[111];
char charIn;

long detectionDebit()
{
  for(int i = 0; i<10; i++)
  {
    duree[i] = pulseIn(Serial3, HIGH);
  }
  for(int i = 0; i<10; i++)
  {
    if(duree[i] < duree[i+1])
    {
      dureeMini = duree[i];
    }
  }
  if(dureeMini < 300)
  {
    baud = 9600;
  }
  else
  {
    baud = 1200;
  }
  return baud;
}

void setup() {

  Serial1.begin(115200);
  baudRate = detectionDebit();
  Serial3.begin(baudRate);
}

void loop() {

  Serial1.println(baudRate);
  Serial1.println(dureeMini);
}

Tu pourrais peut-être utiliser 2 ports séries en parallèle : un à 9600, l'autre à 12000 et voir lequel reçoit des données cohérentes ?

1200, mais très bonne idée

il n'y pas de détection automatique sur ce mcu, donc il faut se débrouiller

la méthode de la mesure de durée de pulsation est délicate à mettre en oeuvre, sauf si on connaît le contenu de la trame qui sert pour la détection

essayer chaque vitesse me semble la bonne option, il faut reconnaître des trames valides, ou chasser le flag d'erreur de trame ; en variante la solution de lesept permet de connaître rapidement l'élu, et de ne pas perdre le début du message

ps : il n'y aucun commentaire dans ton code, on n'a pas l'assurance que tu sais ce que tu fais

elkilleros:
Bonjour,

Je cherche à venir détecter automatique le baud rate présent sur le port série 3 d'une carte Arduino Mega 2560. J'ai besoin d'adapter ce débit pour venir lire les trames d'un appareil qui peut transmettre à 9600 bauds ou 1200 bauds. Pour cela j'initialise dans la fonction void setup() de mon programme le baud rate avec la commande
Serial3.begin(9600) (ou 1200), le problème c'est que je dois retoucher cette valeur à chaque fois que le baud rate de la source change, et j'aimerais automatisé cette détection.

Bonjour
Il y a qq pistes concernant "l'autobauding " sur arduino basique
perso pas testé (pas eu besoin)

Bonjour Artouste, merci
on connait à l'avance les 2 valeurs possibles, donc ce sketch peut être optimisé, comme elkilleros a essayé de le faire

à elkilleros : il me semble qu'il y ait un souci dans "pulseIn(Serial3, HIGH)" : dans le format série asynchrone, les impulsions sont LOW

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.