Comment puis supprimer/ignorer les ligne vides

Bonjour à tous

C’est fonction est importante, mais j’ai du mal a la comprendre. Je suis surement un peu confu car les conditions ne sont pas fermé comme on les apprend a un debutant :slight_smile: if(){}
Bref je dois absolument la corrigé pour une autre raison.

Cette fonction va lire un buffer (char buffer[400]) et il mets dans un array, une ligne par index.

// buffer_by_line est déclarée au dessus de mon setup ainsi:
// char *buffer_by_line[13];
[code]
void SIM908::bufferByLine(char *buffers, char **buffer_by_line)
{
  Serial.println(F("--"));
  Serial.println(buffers);
  Serial.println(F("--"));

  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;

}

Cette fonction me retourne ceci, par exemple:

0.AT+CMGR=1,1
1.
2.+CMGR: "REC UNREAD","+417634xxxx","","14/10/16,21:57:12+08"
3.dir,r
4.
5.OK

Mais des fois elle retourne ceci

0.
1.AT+CMGR=1,1
2.
3.+CMGR: "REC UNREAD","+41763xxxxxx","","14/10/16,21:57:12+08"
4.dir,r
5.
6.OK

Tout ceci parce que le

  Serial.println(buffers);

qu’il y a au debut de la fonction affiche (avec un espace pour premiere ligne:
(Les – sont pour donner des repères

AT+CMGR=1,1

+CMGR: “REC UNREAD”,"+41763435206","",“14/10/16,21:57:12+08”
dir,r

OK

Il faut absolument qu’il n’y ai pas de ligne vide en premier. Soit la premiere ligne doit toujours etre ‘AT+CMGR=1,1’ ou une autre AT command

--
AT+CMGR=1,1

+CMGR: "REC UNREAD","+41763435206","","14/10/16,21:57:12+08"
dir,r

OK
--

En fait ce qu’il serait encore mieux de faire c’est de modifier la fonction pour avoir ceci:

0.AT+CMGR=1,1
1.+CMGR: "REC UNREAD","+41763xxxxxx","","14/10/16,21:57:12+08"
2.dir,r
3.OK

J’ai du mal a comprendre cette fonction, d’abord. Et j’ai encore plus de mal à trouver ou intervenir pour que les lignes vides soient ignorée et pas indexée dans la variable buffer_by_line.

Je vous remercie pour votre aide!!![/code]

Tu pourrais par exemple tester si la ligne est vide à cet endroit et ne pas la mettre dans le tableau si c’est le cas.

  while(i<NBLINES)
    buffer_by_line[i++] = p;

Salut,
ben j’ai essayé ceci mais j’ai du mal m’y prendre
Comment le ferais tu?
J’ai essayé ces deux conditions, mais sans succes

While(i<NBLINES){
//if(p!='')
if(strlen(p)>0)
{
    buffer_by_line[i++] = p;
}
}

if(p!=NULL || p!=’\n’ || p!=’\r’ || strcmp(p, “\r\n”)!=0)

pierrot10:
Salut,
ben j’ai essayé ceci mais j’ai du mal m’y prendre
Comment le ferais tu?
J’ai essayé ces deux conditions, mais sans succes

While(i<NBLINES){

//if(p!=’’)
if(strlen(p)>0)
{
    buffer_by_line[i++] = p;
}
}

C’est à dire que normalement, avant d’écrire le test on cherche à savoir ce que contient la ligne en question.
Le fait que la chaîne n’affiche rien ne veut pas nécessairement dire qu’elle est vide pour autant.
Donc, on commence par faire afficher la chaîne en hexa pour voir le contenu de celle-ci et ensuite on construit le test adapté.

B@tto: if(p!=NULL || p!='\n' || p!='\r' || strcmp(p, "\r\n")!=0)

Il manque quelques étoiles là-dedans il me semble

if(p!=NULL || *p!='\n' || *p!='\r'  || strcmp(p, "\r\n")!=0)

Yep bien vu j'avais juste repris son code. Du coup ça explique pourquoi le sien ne pouvait pas dans tous les cas fonctionner ...