[C] Créer un tableau + trier des données avant envoi

Créer un tableau + trier des données avant envoi [C] - C - Programmation

Marsh Posté le 25-04-2009 à 12:49:54    

Bonjour, Étant pas très doué dans les tableaux et les chaines de caractères, je cherche à créer un tableau de 19 colonne séparés par des espaces puis faire un test sur les données inscrites. En effet le tableau est déjà fait , enfin un truc qui ressemble à un tableau ds le résultat seulement (je met le code plus bas) par contre je n'arrive pas faire le test sur les données:
 
 --> Si les données commencent par 02 et se termine par 03 et qu'il y a 19 valeurs--> OK on passe à la suite (on passe à la ligne et on écrit une nouvelle chaine de 19 données), sinon on rejette et on attend un nouveau 02 ... <19 valeur> ... 03.
 
Ex.:
02 EA 61 02 11 00 00 00 00 00 00 00 00 00 00 00 00 00 03 --> OK       | On Garde
02 EA 53 00 A0 00 00 00 00 00 00 00 00 00 00 00 03 --> No Ok           | On rejette  
02 EA F0 01 0C 00 00 00 00 03 00 00 00 00 00 00 00 00 00  --> No Ok  | On rejette  
...
 
Mon code qui me permet d'enregistrer mes données:
 

Code :
  1. while (1)
  2. int main(int argc, char *argv[]) {
  3.   int rxChar;
  4.   char i;
  5.   i=0;
  6.   FILE* fichiersave = NULL;
  7.   ...
  8. (...)
  9. {
  10.         if (read(tty_fd,&rxChar,1)>0)
  11. {
  12.  fichiersave = fopen(("%s",chaine), "a" ); // j'ouvre un fichier dont l'adresse à était précisé avant
  13.  if (fichiersave != NULL)
  14.  {
  15.   // On écrit dans le fichier
  16.   fprintf(fichiersave, "%02X ",rxChar); //On ecrit en hex les valeur provenant de rxChar
  17.   i++;
  18.                         // aprés 19 écriture je passe à la ligne  
  19.   if (i==19)
  20.   {
  21.   fprintf(fichiersave,"\n" );
  22.   }
  23.    fclose(fichiersave); // après chaque écriture de rxChar je ferme le fichier c'est pour
  24.                                                      // cette raison la présence du " fprintf(fichiersave, "\n" ); " avec le test
  25.   }
  26.   if (i == 19)  // je remet i à 0 aprés les 19 enregistrements  
  27.   {
  28.    i=0;
  29.   }
  30. }
  31. }


 
Je ne sait pas comment m'y prendre pour faire ce test des " 02  - 19 valeurs -  03 " j'ai fait un petit code pour faire ce test ça ma donnée un truc bizarre !
si quelqu'un à une idée de comment faire je le remercie d'avance
 
Ici Le mm code mais ss modifications
 

Code :
  1. (...)
  2. int main(int argc, char *argv[]) {
  3.   int rxChar;
  4.   char i;
  5.   i=0;
  6.   FILE* fichiersave = NULL;
  7.   FILE* fichiernom = NULL;
  8.   char chaine[TAILLE_MAX] = "";  // Chaîne vide de taille TAILLE_MAX
  9.   printf("Acme Serial Test (press ctrl-c to exit)\n" );
  10.   if (tty_open(argv[1])<0) {
  11.    fprintf (stderr,"tty open error %s\n", strerror(errno));
  12.   exit(EXIT_FAILURE);
  13.   }
  14.   if (stdin_init()<0) {
  15.    printf("stdin init error %s\n", strerror(errno));
  16. //  exit(EXIT_FAILURE);
  17.   }
  18.   if (signal (SIGINT, termination_handler) == SIG_IGN) signal (SIGINT, SIG_IGN);
  19.   if (signal (SIGHUP, termination_handler) == SIG_IGN) signal (SIGHUP, SIG_IGN);
  20.   if (signal (SIGTERM, termination_handler) == SIG_IGN) signal (SIGTERM, SIG_IGN);
  21.  
  22.   fichiernom = fopen("/mnt/flash/noms/nom.save", "r" );
  23.   if (fichiernom != NULL)
  24. {
  25.  fgets(chaine, TAILLE_MAX, fichiernom);  // On lit maximum TAILLE_MAX caractères du fichiernom, on stocke le tout dans "chaine"
  26.  printf("%s", chaine);      // On affiche la chaîne
  27.   fclose(fichiernom);
  28. }
  29. /**************************************************************************/
  30. /******* Partie du code concernée *************************************************/
  31.   while (1)
  32. {
  33.  if (read(tty_fd,&rxChar,1)>0)
  34.  {
  35.   printf("%02X ",rxChar);
  36.   fichiersave = fopen(("%s",chaine), "a" );
  37.   if (fichiersave != NULL)
  38.   {
  39.    // On écrit dans le fichier
  40.    fprintf(fichiersave, "%02X ",rxChar);
  41.    i++;
  42.    if (i==19)
  43.    {
  44.    fprintf(fichiersave,"\n" );
  45.    }
  46.    fclose(fichiersave);
  47.   }
  48.   if (i == 19)
  49.   {
  50.    printf("\n" );
  51.    i=0;
  52.   }
  53.  }
  54. }
  55.  return EXIT_SUCCESS;
  56. }


 
la sorti de ce code se fait en 2 parties:  
1) sur la console de Linux
2) une copie dans mon fichier (le plus important)
 
ex. correcte:
...
02 EA 42 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
02 EA 43 00 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
02 EA 43 00 7D 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
02 EA 43 00 77 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
02 EA 44 00 84 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
02 EA 4D 01 79 00 00 00 00 00 00 00 00 00 00 00 00 00 03  
...
 
 
un exemple de ce que je veux éviter:
Ex.incorrecte:
...
02  EA  3D  00  3F  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
02  EA  3D  00  3C  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
00  00  00  00  00  00  00  03  02  EA  3C  00  36  00  00  00  00  00  00
02  EA  47  00  BC  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
02  EA  4E  01  C2  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
...
 
 
ou encore:
...
02  EA  3D  00  3D  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
02  EA  32  00  51  00  00  00  00  00  00  00  00  00  00  00  00  00  03  
02  EA  63  02  03  01  00  00  00  00  00  00  00  00  00  00  00  00  03  
02  EA  64  02  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  --> à cause de cette ligne le reste n'est plus valable pour moi, le 02 de ce qui devait être la ligne suivante a été décalé juste parce qu'il manquait une valeur!!  
EA  64  02  17  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  
EA  64  02  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  EA  
64  02  0A  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  EA  
64  02  12  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  EA  
64  02  21  01  00  00  00  00  00  00  00  00  00  00  00  00  03  02  EA

...
 
 
 
J'attend votre aide!
Merci

Message cité 1 fois
Message édité par anounito le 25-04-2009 à 22:21:24
Reply

Marsh Posté le 25-04-2009 à 12:49:54   

Reply

Marsh Posté le 26-04-2009 à 00:03:47    

anounito a écrit :

Bonjour, Étant pas très doué dans les tableaux et les chaines de caractères, je cherche à créer un tableau de 19 colonne séparés par des espaces puis faire un test sur les données inscrites. En effet le tableau est déjà fait , enfin un truc qui ressemble à un tableau ds le résultat seulement (je met le code plus bas) par contre je n'arrive pas faire le test sur les données:
 
 --> Si les données commencent par 02 et se termine par 03 et qu'il y a 19 valeurs--> OK on passe à la suite (on passe à la ligne et on écrit une nouvelle chaine de 19 données), sinon on rejette et on attend un nouveau 02 ... <19 valeur> ... 03.


Oui, c'est une bête machine à état avec un compteur...  
 
Commence par recenser les évènements, puis, décrit les états et enfin les transitions, c'est à dire les évènements qui font changer l'état. Ensuite tu associes des actions aux transitions si nécessaire...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-04-2009 à 19:05:39    

Et comment je peu faire cette machine à état, je vois ce que tu veux dire mais je ne sais comment y procéder !!!
 
voilà j'ai écrit ce code, mais je doute de son efficacité.
 

Code :
  1. while (1)
  2. {
  3.  if (read(tty_fd,&rxChar,1)>0)
  4.  {
  5.   fichiersave = fopen(("%s",chaine), "a" );
  6.   if (fichiersave != NULL)
  7.   {
  8.    for (i=0; i<19; i++)
  9.    {
  10.     tab[i] = rxChar;  //rxChar étant mes données et tab est déclaré " long tab[19]; "
  11.    }
  12. /* on faite ici ya un problème parce que si mes donnée arrivent comme ça :
  13. .
  14. 02 EA 63 02 03 01 00 00 00 00 00 00 00 00 00 00 00 00 03  
  15. 02 EA 64 02 01 00 00 00 00 00 00 00 00 00 00 00 00 03 02 --> ici j'ai mon tableau des 19 caractères mais se terminant par un 02 parce qu'il manque une valeur et le faite qu'il manque cette valeur, y'aura un décalage et ma premiére valeur sera tt le tps déférente de 02 par après, et donc ne sera pas envoyé avec mon code qui suit !!!
  16. EA 64 02 17 01 00 00 00 00 00 00 00 00 00 00 00 00 03 02  
  17. EA 64 02 01 00 00 00 00 00 00 00 00 00 00 00 00 03 02 EA
  18. 64 02 0A 01 00 00 00 00 00 00 00 00 00 00 00 00 03 02 EA  
  19. */
  20.    if (tab[0]==02 && tab[18]==03)
  21.    {
  22.     fprintf(fichiersave, "%02X ",tab[]);
  23.    }
  24.    if (i==19)
  25.    {
  26.     fprintf(fichiersave,"\n" );
  27.     i=0;
  28.    }
  29.   fclose(fichiersave);
  30.   }
  31.  }
  32. }
  33. return EXIT_SUCCESS;
  34. }


 
Bon si quelqu'un à une petite idée ce sera trééés gentille de ça part.
Merci

Reply

Marsh Posté le 26-04-2009 à 22:39:14    

anounito a écrit :

Et comment je peu faire cette machine à état, je vois ce que tu veux dire mais je ne sais comment y procéder !!!


J'ai indiqué la marche à suivre. Pour le moment, il n'y a aucun code à écrire, seulement de la spécification détaillée...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-04-2009 à 09:19:05    

Merci pour tes précisions, mais moi je m'attend à un début de code, ou qu'on me corrige le code que j'ai mit.
 
Merci !


Message édité par anounito le 27-04-2009 à 09:19:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed