Tableaux

Bonjour, voila enfaite je reçoit une trame qui varie entre 28 et 60 caractères, elle se présente de cette façons :

14:16:18,06/01/16,3,3,4,1,5,8

le dernier caractère étant un entier qui est modifier lorsque la machine qui m'envoie la trame subit un dysfonctionnement ainsi elle peut être notée :

14:16:18,06/01/16,3,3,4,1,5,1024

Voici mon programme :

int tab[60];
int i;
int a;
int inByte;
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() 
{
  // read from port 1, send to port 0:
  if (Serial1.available()) 
  {
    inByte = Serial1.read();
    tab[i] = inByte;
    i++;
    delay(10);
    if(inByte == '\r')
    {
      Serial.println();
      message = 
      for(a=28;a<i;a++)
      {
      Serial.write(tab[a]);
      }
      Serial.println();
      
      i=-1;
    }
  }
}

Ici puisque la taille de ma trame est dynamique, je me sert du retour chariot pour détecter la fin de la trame.

je crée donc un tableau afin de pouvoir piocher les informations qui m'intéresse dans la trame et lorsque le retour chariot arrive je sais que la trame est finie.

Le retour chariot visualisé, j'envoie sur le serial les caractères n°28 jusqu'à la fin de trame - 1 pour ne pas avoir le retour chariot dans mon serial.

je reçoit donc ceci :

1024

c'est donc ce que je souhaite recevoir car c'est le code erreur, le reste de la trame n'est pas important pour moi. Cependant, la je ne fait que lire les valeur du tableau à la position 28 à fin de trame -1, ce que je souhaite c'est pour mettre ces valeur dans une seule variable afin tous simplement m'envoyer cette variable sur mon GSM (le code du GSM est déjà fait).

j'avais pensé faire : message = tab[28]+tab[29]+.... mais sa ne fonctionne pas tous simplement car je ne sais pas jusque quel position mon tableau va pouvoir aller.

Cordialement merci de votre futur aide.

bonjour,
strcat par exemple

char str[80];
 if(inByte == '\r')
    {
      Serial.println();
      message =
      for(a=28;a<i;a++)
      {
      Serial.write(tab[a]);
strcat (str,tab[a]);
      }
      Serial.println();
     
      i=-1;
    }

Merci je vais essayer sa tous de suite !

J'ai testé, sa me marque :

Erreur_Acqui.ino: In function 'void loop()':
Erreur_Acqui:27: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
In file included from D:\ARDUINO\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,
from Erreur_Acqui.ino:1:
d:\arduino\hardware\tools\avr\avr\include\string.h:122:14: error: initializing argument 2 of 'char* strcat(char*, const char*)' [-fpermissive]
extern char *strcat(char *, const char );
^
invalid conversion from 'char' to 'const char
' [-fpermissive]

voici mon code :

char tab[60];
int i;
int a;
char inByte;
char str[80];
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() 
{
  // read from port 1, send to port 0:
  if (Serial1.available()) 
  {
    inByte = Serial1.read();
    tab[i] = inByte;
    i++;
    delay(10);
    if(inByte == '\r')
    {
      Serial.println();
      for(a=28;a<i;a++)
      {
        //Serial.print(tab[a]);
        strcat(str,tab[a]);
      }
      Serial.println(str);
      
      i=-1;
    }
  }
}

Bonjour,

Le plus simple est de traiter la trame reçue comme une chaine de caractère, c'est à dire en C comme un tableau de caractère terminé par 0.
Ensuite tu copie la chaine à partir du caractère voulu dans une autre chaine.
Ce qui donne

char tab[60];
int i = 0;
int a;
char inByte;
char str[80];
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  // read from port 1, send to port 0:
  if (Serial1.available())
  {
    inByte = Serial1.read();
    tab[i] = inByte;
    //    delay(10);
    if (inByte == '\r')
    {
      tab[i]=0;       // marque la fin de la chaine
      Serial.println();
      strcpy(str,tab+28);
      Serial.println(str);

      i=0;
    }
    else
    {
      i++;
    }
  }
}

J'ai aussi corrigé deux erreurs

  • i n'était pas initialisé avant l'emploi
  • i était rénitialisé à -1 alors qu'il doit être réinitialisé à 0

Sa fonctionne correctement merci ! Je pense que je vais aller lire un peu le fonctionnement des différentes instructions c'est vachement utile par exemple cette fonction "strcpy" !

Je ré-ouvre ce sujet car j'ai une question par rapport à ce que je reçois.

donc lorsque j'ai une trame de type:

14:16:18,06/01/16,3,3,4,1,5,1024

le fait d'utiliser "strcpy(str,tab+28);" me donne : 1024.

Ce que je voudrais c'est pouvoir comparer cette valeur à une valeur d'origine ( comparer 1024 à 200 ), ainsi si je trouve un nombre différent de 1024, le programme me renvoie une erreur j'ai donc fait comme ceci :

strcpy(str,tab+28);
if(str!=200);
{
Serial.println("ERREUR TEST");
}

Je n'arrive pas compiler et le programme me renvoie cette erreur :

gsm.ino: In function 'void loop()':
gsm:48: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
ISO C++ forbids comparison between pointer and integer [-fpermissive]

j'ai donc mit strcpy(str,tab+28);
if(str!="200");
{
Serial.println("ERREUR TEST");
}

Cependant même avec des nombres différents de 200, je ne voie pas le ERREUR TEST.

Merci de votre futur aide.

Bonjour,

Il faut utiliser strcmp

if (strcmp(str,"200")!=0)
...

Merci bien kamill ! Je vais tester de suite.