Problème de lecture de deux fichiers sur unr carte SD

Bonjour à toutes et à tous,

Je réalise un programme sur un STM32F103C8T6.

Sur une carte SD j'ai deux fichiers que je dois lire dans le setup de mon sketch. Voici la partie de programme concernée :

  if (!SD.begin(CHIP_SELECT)) {
    affErreur("CARTE SD");
  }
  initSeqFP();
  dataFile = SD.open("ProgFP.txt"); // Fichier de programmation
  if (dataFile) {
    uint8_t i = 0;
    while (dataFile.available()) {
      FP[i] = dataFile.readStringUntil('\r\n');
      i++;
    }
    dataFile.close();
    litSeqFP();
  }
  dataFile = SD.open("MaJDate.txt"); // Fichier de mise à la date
  if (dataFile) {
    Serial.println("MaJDate.txt fichier ouvert");
    uint16_t v[4];
    uint8_t i = 0;
    while (dataFile.available()) {
      v[i] = dataFile.readStringUntil('\r\n').toInt();
      i++;
    }
    dataFile.close();
//    rtc.setDate(v[0], v[1], v[2], v[3]);
    SD.remove("MaJDate.txt");
  }

Si je commente la lecture du deuxième fichier (MaJDate.txt), la lecture du fichier ProgFP.txt se passe bien.

Je décommente le fichier MaJDate.txt et là, ça se bloque au niveau de sa lecture !

Je commente alors le fichier ProgFP.txt et là, la lecture du fichier MaJDate.txt se passe bien.

Mon programme ne veut pas lire les deux fichiers l'un derrière l'autre.

Qu'est-ce que j'ai oublié ?

Cordialement.

Pierre.

De nous monter la déclaration de FP[i] pour en connaitre le type.
De nous dire comment sont constitués les fichiers que tu lis.

La déclaration de FP :

String FP[6];

Un exemple de fichier ProgFP.txt :

1;354;1;458;461;2;558;566;3;650;822;1;885;
2;355;3;944;
3;294;0;356;825;2;902;627;1;768;
4;292;2;435;845;3;921;434;1;770;
5;578;3;627;659;2;708;856;1;934;751;0;812;
6;789;3;880;602;1;742;214;0;559;

et un exemple de fichier MaJDate.txt :

2
10
8
2023

Cordialement.

Pierre.

Bon, en enlevant des morceaux de code, je pense avoir trouvé le problème. Cela ne vient pas des lectures de la carte SD, mais d'un fonction qui est incluse dans la première lecture : litSeqFP().

Dans cette fonction, je viens placer des morceaux de FP[i] dans un tableau à deux entrées et c'est, je pense, là où j'ai dû me mélanger les crayons dans l'ordre des indices sur lesquels j'avais pourtant porté mon attention. Ce qui est étrange, c'est que le programme fonctionne bien (peut-être quae dans ce cas, des débordements de la pile ne gênait personne) ! Voici les variables et le code :

struct sequence {
  uint8_t valid;
  uint16_t dep;
  uint8_t mode;
  uint16_t fin;
};
sequence seqFP[4][6]; // La première accolade est le mode et la deuxième est la voie
String FP[6];
void litSeqFP() {
  int8_t pN[13];
  for (uint8_t i = 0; i < 6; i++) { // Nombre de fils pilotes
    for (uint8_t j = 0; j < 13; j++)  // Nombre de ";" dans la phrase
      pN[j] = 0;
    int8_t p = -2;
    int8_t j = 0;
    do { // Trouve la position de chaque délimiteur
      p = FP[i].indexOf(';', p+2);
      if (p > 0) {
        pN[j] = p;
        j++;
      }
    }
    while(p > 0);
    uint8_t k = 0;
    uint8_t seq = 0;
    while (pN[k+1] > 0) { // Nombre de ";"
      uint16_t val = FP[i].substring(pN[k]+1, pN[k+1]).toInt();
      switch (k % 3) {
        case 0:
          seqFP[seq][i].dep = val;
          seqFP[seq][i].valid = 0;
          break;
        case 1: 
          seqFP[seq][i].mode = val;
          break;
        case 2:
          seqFP[seq][i].fin = val;
          seqFP[seq][i].valid = 1;
          seq++;
          break;
      }
      k++;
    }
  }
}

J'ai donc changé sequence seqFP[4][6] en sequence seqFP[6][4];

Mais là, j'avoue que je n'y comprends plus rien car, à l'utilisation, mon premier indice représente les 4 séquences et le deuxième les 6 fils pilotes alors que dans la définition de la variable, c'est l'inverse ???

A moins que ce soit encore autre chose !

Cordialement.

Pierre.

Tu sais qu'avec quelques Serial.print() tu peux savoir ce qui se passe.

Oui, je sais. Je le fait systématiquement en cas de problème.

Pour autant, ce n'est pas la panacée. Souvent un serial.print() ne se termine pas alors qu'il est en amont d'un problème.

J'ai plutôt souvent résolu mes problèmes en supprimant et réintroduisant des morceaux de programmes. Ce qui a été le cas ici.

Ce que je ne m'explique pas est la position des indices de mon tableau à deux dimensions :

sequence seqFP[6][4]; soit seqFP[Nb fils Pilote][Nb séquences]

et son utilisation :

seqFP[i][j].valid = 0; avec seqFP[Nb séquences][Nb Fils Pilote]

Entre la définition et l'utilisation, les indices sont croisés !

Est-ce qu'un sizeOf me permettrait de mieux comprendre ?

Cordialement.

Pierre.

Hello, dans ce cas, rajoute après le Serial.print qui ne se termine pas:
Serial.flush();

Je pense avoir résolu mon problème.

J'ai remis tous les indices dans le bon ordre : ça fonctionne.

Pour autant, avec les indices inversés, ça fonctionnait (ou semblait fonctionner ?) aussi !

Est-ce qu'il y a un ordre pour lire / écrire dans un tableau ? D'abord les lignes puis les colonnes ?

Cordialement.

Pierre.

Non, l'accès est aléatoire, on peut lire/écrire dans n'importe quel ordre

Il faut dire aussi que l'héritage du basic avec i et j pour balayer les tableaux c'est pas terrible pour s'y retrouver. Il vaut mieux prendre des noms un peu plus explicites pour les index.
tableau[ligne][colonne].

J'aurais pu éclaircir la chose en déclarant en plus une structure pour le fil pilote tel que :

struct sequence {
  uint8_t valid;
  uint16_t dep;
  uint8_t mode;
  uint16_t fin;
};

struct filPilote {
  sequence seq[4]; // Le tableau de séquences
};

filPilote filPi[6]; // Le tableau de fils pilote

Ensuite, pour l'appel à une séquence d'un fil pilote j'aurais écrit par exemple :

uint8_t m = filPi[i].seq[j].mode;

De cette manière, on savait à qui appartenait l'indice. C'est ce que je fais d’habitude en Pascal Objet, mais là, je n'ai pas fait tilt !

Cordialement.

Pierre.

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