[b]Remplir un "Array" avec une Trame série[/b]

Bonjour a tous
Je viens a vous car le bloque sur une étape, qui je pense sera simple pour vous j'espère que vous pourrez m'aider

Alors j'ai un Ecu moteur qui possède une voie série (RS232) qui a la possibilité d'envoyé en boucle des données moteur préalablement défini par le logiciel

j'arrive sans problème a les réceptionné avec un MAX3232 (convertisseur RS232 - TTL)

j'aimerais pouvoir automatiquement pouvoir identifié chaque trame et remplir un tableau avec ses valeurs, par la suite je vais convertir ses valeurs et les affiché sur un écran mais ça j'ai pas de problème j'arrive a le faire.

Mon blocage se situe bien sur le filtrage des info entrant pour rentré chaque valeur dans une case d'un tableau

la séquence de Transmission : Header byte, stream data, checksum byte

pour mon exemple j'ai simulé une séquence type avec une seule valeur, mais je peu en paramétré entre 1 et 19

Voici le programme :


#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1); // RX, TX

void setup() {
  mySerial.begin (9600);
    
}

void loop() { 

  mySerial.write (0x55);
  mySerial.write (0xff); 
  mySerial.write (0xff);
  
}

0x55 étant le Header byte
0xff étant la valeur qui évoluera entre 0 et 255 en Hex
0xff étant le checksum byte, qui lui es dépendant de la ou des valeurs précédente
Loop

exemple de trame avec par plusieurs valeurs :

0x55 Header
0x ?? valeur 1 (entre 0-255 Hex)
0x ?? Valeur 2 (entre 0-255 Hex)
0x ?? Valeur 3 (entre 0-255 Hex)
0x ?? Checksum (dépendant des 3 valeurs précédente)
Loop

Merci d'avance a toutes Âme charitable qui pourra m'éclairé, j'ai essayer une nuit entière sans succès, ça remplissais les cases aléatoirement

Sinon un amis m'a conseillé aussi de faire un buffer, mais la je suis encore plus perdu j'ai fait quelque recherche mais j'ai rien compris

Voici mon programme foireux, enfin l'un de mes programme foireux :

je reçois sur la voie série simulé
je remplis les cases
et je renvoi les valeurs des cases sur le Serial monitor du pc


#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
int trame[3]={10,20,30}; 
int n=0;
void setup() {
  
 mySerial.begin(9600);
 Serial.begin(9600);
}
void loop() {
  if (mySerial.read() == 0x55) {
      n = 0;
  }
 if (mySerial.available() && n<3) {
  trame [n] = mySerial.read();
  n++;
  }
  else {
    Serial.print (" Case 1 : ");
    Serial.println(trame[0]);
    Serial.print (" Case 2 : ");
    Serial.println(trame[1]);
    Serial.print (" Case 3 : ");
    Serial.println(trame[2]);
    
  }

Bonjour,

Tu peux essayer ça:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
byte trame[20];

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
}
void loop() {
  if (mySerial.available())
  {
    if ((trame[0] = mySerial.read()) == 0x55)
    {
      int nbOct = mySerial.readBytes(trame + 1, sizeof trame - 1);
      nbOct++;            // pour compter l'octet du début
      Serial.print("Recu: ");
      for (int i = 0; i < nbOct; i++)
      {
        Serial.print(trame[i]);
        Serial.print(" ");
      }
      Serial.println();
    }
  }
}

Kamill tous d'abord merci de te pencher sur mon problème

Voici le résultat :

il y a visiblement des ratés me semble ? ça me faisais cela aussi
pourtant niveau électrique c'est brancher côte a côte avec les même alimentations (et masses surtout)

si je comprend bien le programme

ta crée un tableau de 20 cases

et tu le remplis si tu reçois bien 0x55

je me demande, quand es-til quand l'une de mes valeurs sera égale a 85 (0x55) ça risque pas de tous décalé ?

Oui, le timeout est trop long.
Comme le protocole ne comporte ni caractère de fin ni nombre d'octets, la seule façon pour savoir si la transmission est terminée est le timeout.
Tu peux le réduire en mettant par exemple:
mySerial.setTimeout(50);dans le setup

Il faut que le timeout soit inférieur à la durée entre 2 messages

le nombre d'octets es connue si dans mon exemple la trame fait 3 octet après si je paramètre dans mon écu 3 valeurs ça fera 3 valeurs de 1 octet chacun + l'octé de début et de fin soit 5 octet
la taille de chaque data es de 8 bits

les messages s’enchaîne sans délais pas évident

Dans ce cas tu dimensionnes le tableau trame[] au nombre d'octets espérés

Remarque: si les messages s'enchainent sans délai, la communication n'est pas fiable, car le caractère de début peut se retrouver dans le checksum, ce qui va faire croire (à tord) à un début de message.

j'ai testé avec le Timeout d'abord en 50, ensuite 10 ensuite 1 ça fait pareil un coup des lignes:
85 255 85 255 (anormal)
un coup:
85 255 255 (normal)

Voici les réglages possible au niveau de la télémétrie de l'écu

et Voici se que je reçois en série de l'écu directement
mis a part le paramètre de la trame en dessous correspond pas a l'image ci-dessus mais a une seule valeur (Parameter Count : 1)

et oui c'est bien se qui me semble si ça s’enchaîne en continue c'est difficile si l'une de mes valeur se trouve être 0x55 se qui es le cas vu que ça fait partie de la plage de valeur alors ça va tous me décalé, croyant que se 0x55 sera le début de trame alors que ce n'es pas le cas

Sinon es-ce que l'un des réglage de Parity ou d’inversion de checksum peu aider a quelque chose ?
sinon faut essayer de lire la trame du début a la fin, et déterminé le byte de fin qui es je crois la somme de tt les valeurs ? j'ai su mais j'ai oublié

Comme je te l'ai dit si tu connais le nombre d'octets tu peux laisser le timeout standard et dimensionner trame[] au nombre d'octets transmis.
Par contre quand tu reçois 85 255 85, ça semblerait indiquer que tu perds des octets. Ca peut venir du faite que la vitesse de transmission au moniteur série n'est pas suffisante (on doit transmettre 3 ou 4 fois plus d'octets qu'on en reçoit). Mets Serial à 115200 bds

j'ai redimensionné a 3 bytes le tableau comme tu peu le voir 3 postes au dessus j'ai bien le problème de 85 255 85
je suis en 9600 baud actuellement

je vais essayer a 115200 de suite

HS: c'est normal se délais de 5mn de merde sur le forum ? quand je veux édité c'est super gênant

Oui, la temporisation est débloquée après que tu ais envoyé un certain nombre de message (je pense que c'est 20, mais n'en suis pas sur)

Voici le résultat, non concluent :frowning:

pour le Forum, je constate que c'est plutôt tous les 2 commentaire, la je publie se message la, si je veux l'édité derrière ou en poster un autre je suis bloquer, c'est excessivement pas pratique c'est dommage

C'est le serial utilisé pour l'affichage qui doit être plus rapide -> Serial à 115200 bds (je soupçonne l'affichage de perturber la réception)
mySerial doit rester à 9600 bauds, autrement on aggrave le problème.

je viens de comprendre que tu parlais du moniteur série plus vite que la transmission de l'écu, mais ça fait le même résultat

Pourtant en vérifiant directement se que transmet l'écu ou l'arduino simulateur de l'écu avec mon petit logiciel d’acquisition série, j'ai pas de perte, pourtant la on passe par le CH340 puis l'usb pour arrivé au pc

Résultat :

FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF 55 FF FF

C'est hallucinant!
Tu peux essayer d'afficher tous les octets recus avec

void loop() {
  if (mySerial.available())
  {
    Serial.print(mySerial.read(),HEX);
    Serial.print(" ");
  }
}

Je modifie mon message. J'ai vu que tu as mis un setTimeout à 1. Ca ne peut pas fonctionner avec un timeout de 1. Supprime le !!!!

Pour le Timeout, j'ai essayer en le supprimant tous a l'heure ça faisais le même résultat

et voici le résultat du dernier test que tu m'a soumis Resultat Positif, mais pas quand il s'agis de remplir les cases :

FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55 FF 55

La capture avec un terminal ne permet pas de savoir s'il y a ou non une pause entre 2 messages.
Il faudrait utiliser un soft un petit peu plus sophistiqué il y en a sur le net qui datent les échanges (comme terminalbpp par exemple). Je serais vraiment surpris qu'il n'y ait aucune pause entre 2 messages.

Autrement tu peux te bricoler quelque chose avec l'arduino en datant les échanges avec millis().

Voici le résultat, je scanne direct l'écu la du coup

Si il y a une action particulière a faire pour scanner si il y a un délais j'ai pas trouvé

j'ai fait un LogDateStramp tu peu le télécharger en bas, je sais pas a quoi ça sert mais bon

Lien : DL.FREE.FR

Il faut cocher time qui devrait normalement donner une information de temps sur les échanges.