Je ne comprends pas pourquoi ce code me dupprime des caracteres

Bonjour à tous,

On m’a porposé une excellente fonction. J’aimerais légèrement la modifier et en m’y penchant dessus, il y a un truc qui m’interpelle et que je n’arrive pas à comprendre.

Voici les détails

Ceci sont les lignes à traiter. Elle sont contenues dans la variable ‘buffer’ (char buffer[400]) et elle est passée dans le paramettre ‘buffers’, dans la fonction qui suit plus bas

AT+CENG?

+CENG: 1,1

+CENG:0,"0016,30,99,228,02,45,7509,05,05,1388,255"
+CENG:1,"0885,19,14,750e,228,02,1388"
+CENG:2,"0875,18,12,750d,228,02,1388"
+CENG:3,"0018,26,42,750a,228,02,1388"
+CENG:4,"0014,23,44,750b,228,02,1388"
+CENG:5,"1017,18,47,5f5d,228,02,1388"
+CENG:6,"0874,15,13,147d,228,02,1388"

OK

Cette fonction, va mettre toutes ces lignes dans un array. Voic le fonction

// buffer_by_line est déclarée au dessus de mon setup ainsi:
// char *buffer_by_line[13];

void SIM908::bufferByLine(char *buffers, char **buffer_by_line)
{
  Serial.println(buffers);

  char *p = buffers;
  byte i = 0;

  buffer_by_line[i++] = p;

  while (*p) {
    if (*p=='\n') {
      *p++ = '\0';
      if (*p=='\r')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
    if (*p=='\r') {
      *p++ = '\0';
      if (*p=='\n')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
      p++;
  }
  while(i<NBLINES)
    buffer_by_line[i++] = p;

}

Et voici le résultat que va afficher ceci

for(byte cc=0; cc <= NBLINES; cc++ )
    {
      Serial.print(cc); Serial.print(F(":"));Serial.println(supprimeCaractere(buffer_by_line[cc],'"'));
    }

Résultat

0:
1:
2:
3:
4:+CENG:0,0016,30,99,228,02,45,7509,05,05,1388,255
5:+CENG:1,0885,19,14,750e,228,02,1388
6:+CENG:2,0875,18,12,750d,228,02,1388
7:+CENG:3,0018,26,42,750a,228,02,1388
8:+CENG:4,0014,23,44,750b,228,02,1388
9:+CENG:5,1017,18,47,5f5d,228,02,1388
10:+CENG:6,0874,15,13,147d,228,02,1388
11:
12:
13:

Ma question 1
Pourquoi et qu’es-ce qu’il fait que les lignes 0,1,2,3 et 12 sont vides.
C’est ce que je n’arrive pas à comprendre dans la fonction
C’est c’est a cause de \n, pourquoi il ne fait pas la meme chose avec les ligne 4,6,7… etc?.
Qu’es-ce qu’il fait pour qu’il concidere que les lignes 4,5,6,7,8,9,10.
C’est bien ce que je veux, mais je n’arrive pas a comprendre ce qui distingue les lignes à garder et à supprimer.

Ma deuxième question
J’aimerais bien modifier la fonction pour avoir ceci en sortie

0:+CENG:0,0016,30,99,228,02,45,7509,05,05,1388,255
1:+CENG:1,0885,19,14,750e,228,02,1388
2:+CENG:2,0875,18,12,750d,228,02,1388
3:+CENG:3,0018,26,42,750a,228,02,1388
4:+CENG:4,0014,23,44,750b,228,02,1388
5:+CENG:5,1017,18,47,5f5d,228,02,1388
6:+CENG:6,0874,15,13,147d,228,02,1388

Que me suggeriez-vous?

Milles mercis

Salut,

pierrot10:
Ma question 1
Pourquoi et qu'es-ce qu'il fait que les lignes 0,1,2,3 et 12 sont vides.
C'est ce que je n'arrive pas à comprendre dans la fonction
C'est c'est a cause de \n, pourquoi il ne fait pas la meme chose avec les ligne 4,,6,7... etc?.
Qu'es-ce qu'il fait pour qu'il concidere que les lignes 4,5,6,7,8,9,10.
C'est bien ce que je veux, mais je n'arrive pas a comprendre ce qui distingue les lignes à garder et à supprimer.

Je ne vois a priori aucune raison pour que la méthode bufferByLine fasse cela. En revanche tu fais appel à une fonction supprimeCaractere pour semble-t-il enlever tous les « " » présents dans la chaîne. Or toutes les chaînes qui sont retournées vides sont justement celles qui ne contiennent pas ce caractère --> le bug est donc très probablement dans supprimeCaractere.

pierrot10:
Ma deuxième question
J'aimerais bien modifier la fonction pour avoir ceci en sortie

0:+CENG:0,0016,30,99,228,02,45,7509,05,05,1388,255
1:+CENG:1,0885,19,14,750e,228,02,1388
2:+CENG:2,0875,18,12,750d,228,02,1388
3:+CENG:3,0018,26,42,750a,228,02,1388
4:+CENG:4,0014,23,44,750b,228,02,1388
5:+CENG:5,1017,18,47,5f5d,228,02,1388
6:+CENG:6,0874,15,13,147d,228,02,1388

Que me suggeriez-vous?

D'attendre d'avoir la réponse à la première question :slight_smile:

Bravo, c'est exactement ca! Mince.

Alors ce complique pour la deuxième question $) car le résultat est celui ci

0:AT+CENG?
1:
2:+CENG: 1,1
3:
4:+CENG:0,"0875,24,99,228,02,12,750d,28,00,1388,255"
5:+CENG:1,"0885,19,14,750e,228,02,1388"
6:+CENG:2,"0016,28,45,7509,228,02,1388"
7:+CENG:3,"1017,16,47,5f5d,228,02,1388"
8:+CENG:4,"0014,20,43,1609,228,02,1388"
9:+CENG:5,"1002,17,15,875b,228,02,1388"
10:+CENG:6,"0018,17,42,750a,228,02,1388"
11:
12:OK
13:

C'est pas grave pour les ". Je devrait les enlever plus tard, mais pour le moment le deuxième question m'importe plus.

Le problème, c'est que je peux aussi avoir le retour d'une autre commande, comme par exemple

0:AT+COPS?
1:
2:+COPS:"Sunrise"
3:
4:OK

Et la il faudra que je garde que j'aie

1:+COPS:"Sunrise"

=(