Acces d'un tableau de structures

Bonjour a tous et merci d'avance a ceux qui pourront m'aider, je pense c'est pas compliqué c'est juste la première fois que j'essaye de manipuler des structures.

Mon programme est simple, je dois recevoir un chiffre a travers le port série, ici pour le test j'utilise le "serial monitor" puis ce chiffre me permet de chercher et afficher le contenue d'une structure de 5 bytes.
L'application est pour simplement charger différents paramètres (stockés dans chaque structure) quand mon appareil reçois un message de changement de paramètres ( changement de preset), le message en lui ne contient pas les parametres mais lui dis "charge ton preset N 5" par exemple.

Voici mon code :

char MidiPC, RX;
const char endMarker = '\n';

typedef struct  {
   byte FLG;
   byte EXch1;
   byte EXch2;
   byte EXled1;
   byte EXled2;
 }PRESET;  

PRESET PCreceived;       // sers de tampon pour passer les parametres du tableau
static const PRESET MIDI_PRESET[] = {                              // le tableau avec les parametres
            {0b00000000, 0, 0, 0b00000000, 0b00000000},  // ' 0 '  comme au demarrage, tout a zero
            {0b11000000, 0, 0, 0b00000001, 0b00000000},  // ' 1 '           
            {0b11000000, 1, 0, 0b00000010, 0b00000000},  // ' 2 '
            {0b11000000, 2, 0, 0b00000100, 0b00000000},  // ' 3 '
            {0b11000000, 3, 0, 0b00001000, 0b00000000},  // ' 4 '
            {0b11000000, 4, 0, 0b00010000, 0b00000000},  // ' 5 '
            {0b00100000, 0, 0, 0b00100000, 0b00000000},  // ' 6 '          
            {0b11000000, 0, 0, 0b00000000, 0b00000001},  // ' 7 '           
            {0b00001100, 0, 1, 0b00000000, 0b00000010},  // ' 8 '
};

void setup() {
  // put your setup code here, to run once:

Serial.begin(9600);
Serial.println("what PC you want?");
 
}
void loop() {
  // put your main code here, to run repeatedly:

if (Serial.available())
{
 RX=Serial.read(); 
      if (RX != endMarker)
      {
             MidiPC=RX; 
             PCreceived = MIDI_PRESET[MidiPC];
             Serial.print("Program Change :  ");
             Serial.println(MidiPC);
             Serial.print(" Exp Flags are :  ");
             Serial.println(PCreceived.FLG);
             Serial.print(" Exp 1 chanel is :  ");
             Serial.println(PCreceived.EXch1);
             Serial.print(" Exp 2 chanel is  :  ");
             Serial.println(PCreceived.EXch2);
             Serial.print(" Exp 1 leds are :  ");
             Serial.println(PCreceived.EXled1);
             Serial.print(" Exp 2 leds are :  ");
             Serial.println(PCreceived.EXled2);
             Serial.println( sizeof(MIDI_PRESET[MidiPC]));
             RX=0;
             return;
      }
      else return;
}
}

vous recevez le code ASCII, il faut soustraire '0' pour avoir l'index

PCreceived = MIDI_PRESET[MidiPC-'0']; // Attention pas de traitement d'erreurs...

attention suivant la configuration de la console vous pouvez recevoir aussi bien '\n' que '\r' ou les 2 ==> ce serait une bonne idée de vérifier que l'index est correct (entre '0' et '4') avant d'aller affecter la structure

merci d'éditer votre post et de remettre votre code entre balises de codes après l'avoir indenté (ctrl-T sous l'IDE), ça facilite la lecture

1 Like

À la place de cette ligne tu peux essayer un memcpy
Genre
memcpy (&PCreceived, &MIDI_PRESET + MidiPC * sizeof(PRESET), 5);

Édit: au temps pour moi, c'est J-M-L qui a trouvé le problème.

Merci de ta réponse, mon code fonctionne, je veux dire ça compile sans erreur,
juste ça m'affiche n'importe quoi, comme si soit j'avais mal initialisé mon tableau soit ma façon de chercher les infos dedans ne sont pas correctes

outre le pb de l'ASCII :slight_smile: , les structures sont des variables sympas, on peut copier directement l'une dans l'autre par simple affectation avec =, donc pas la peine de s'ennuyer avec memcpy()

En effet ça fonctionne!!! mais alors ça veut dire qu'avec une communication serie simple (comme le midi) mon code etait bon. merci je vais continuer alors !

Oui c'est ce que je dis. vous allez chercher le mauvais index car quand vous recevez le caractère '0', c'est le code ASCII que vous utilisez et ... il ne vaut pas 0 (mais 48) donc il faut faire (après vérification du range)

PCreceived = MIDI_PRESET[MidiPC-'0'];

si c'est effectivement une communication en binaire et pas en ASCII, oui. (faudra peut-être jouer des masques car certains champs midi sont un mélange d'infos)

1 Like

oui ça c deja implementé pour decoder les messages midi ça marche bien.
encore merci pour la rapidité et l'aide efficace, je savais pas que le ascii etait si different

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