Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Importance du zero terminateur de string
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » jeu. 20 déc. 2018 12:05

Bonjour,

avec ou sans ficelle, il faut tenir le string !

oops Je me suis ENCORE fait piegé avec ce probleme ( si souvent rencontré!)
dans l'exemple ci dessous, j'envoie une trame via un terminal, qui doit stocker les differents elements
dans l E'eprom du PIC
1 valeur (en ascii) stockée modulo 16 cars .

je constate que mes 2 premieres valeurs sont buguées apres relecture de l'eeprom ..
:mur: Quelques heures de perdues ...à rechercher ailleurs

il s'avere que je ne copiais pas le zero final du string dans l'eeprom
(string = chaine de caractere DEVANT SE TERMINER PAR UN ZERO )

Dans certain cas, c'est oubli envoie le programme Ad Patres .. dans les choux.!
et là on peut reagir vite devant l'evidence.
Dans d'autre cas, comme celui ci c'est flou..

cet exemple montre aussi l'avantage d'utiliser strtok pour ézparer les valeurs reçues

Programme :
Envoi de cette trame ,via TeraTerm terminal :
CHAUFF;8392703;8392223;4258847;4258847;1838176;16776319;1835584;14679679;5507832;14155775;
8392703
8392223
4258847
4258847
1838176
16776319
1835584
14679679
5507832
14155775

La separation des champs via ";" est OK

relecture EEPROM Table Programmation Chauffage sur 24H
83927035 83927035 05009FFB
8392223ÿ 8392223 00800E1F
4258847 4258847 0040FC1F
4258847 4258847 0040FC1F
1838176 1838176 001C0C60
16776319 16776319 00FFFC7F
1835584 1835584 001C0240
14679679 14679679 00DFFE7F
5507832 5507832 00540AF8
14155775 14155775 00D7FFFF
19:10:48 152

Relecture EEPROM :
les 2 premieres valeurs sont buggées et pas les autres ?
rajout de 5 sur la 1ere
rajout de ÿ sur la deuxieme ?

un 2em envoi avec les 2 premieres valeurs sur 2 digits seulement
relecture EEPROM Table Programmation Chauffage sur 24H
1092703ÿ 1092703 0010AC5F
2092223ÿ 2092223 001FECBF
4258847ÿ 4258847 0040FC1F
4258847ÿ 4258847 0040FC1F
1838176ÿ 1838176 001C0C60
16776319ÿ 16776319 00FFFC7F
1835584ÿ 1835584 001C0240
14679679ÿ 14679679 00DFFE7F
5507832ÿ 5507832 00540AF8
14155775ÿ 14155775 00D7FFFF
montrent que apres 10 ou apres 20 , il traine des relicats de l'ancienne valeurs

because Le ZERO fin de chaine n'est pas ecrit dans l'eeprom !
k represente la longueur de chaque segment de commande ( séparé par ";")
for (i=0;i<k;i++) // BAD
il faut
for (i=0;i<=k;i++) //OK
// avec k=15 i evolue de 0 à 15 soit 16 caracteres (incluant le zero)

Code : Tout sélectionner



/CHAUFF;8392703;8392223;4258847;4258847;1838176;16776319;1835584;14679679;5507832;14155775;
      if((*(p1)=='C') && (*(p1+5)=='F') )
      {
       UART1_Write_CText("Modif Programme Chauff. :\r\n ");
       UART1_Write_Text(Buffer1);  // buffer reception UART1
       CRLF1();
       p1=p1+7; // pointe apres CHAUFF;
       p3 = strtok(p1, ";"); // affectation pointeur de char p3 à la recherche des segments
       Nx=0;
       j=0x0000;
       while (p3 >0)
       { strConstRamCpy(TEXTE,"123456789012345") ;
         strcpy(&TEXTE[0], p3);
         UART1_Write_Text(TEXTE);CRLF1();
         k=strlen(p3);
         //for (i=0;i<k;i++)  // BAD !!
         for (i=0;i<=k;i++)   // OK
         {
           EEPROM_Write(j+i,*(p3+i));
           Delay_ms(30);
         }
      //   EEPROM_Write(j+i,0);
         L1= atol(p3);
         Table_Active_Programme[Nx]=L1;  // table recevant les commandes de chauffage fils pilotes
         Nx=Nx+1;
         j=j+0x0010; // progression modulo 16 adressage EEPROM PIC
         p3 = strtok(0, ";"); // next pointeur ,occurance de  ;
        }
       p1=0;
       Relecture_Table_Programmation_Chauffage();


Resultat OK apres correctif bug

Modif Programme Chauff. :
CHAUFF;10;20;4258847;4258847;1838176;16776319;1835584;14679679;5507832;14155775;
10
20
4258847
4258847
1838176
16776319
1835584
14679679
5507832
14155775
relecture EEPROM Table Programmation Chauffage sur 24H
10 10 0000000A
20 20 00000014
4258847 4258847 0040FC1F
4258847 4258847 0040FC1F
1838176 1838176 001C0C60
16776319 16776319 00FFFC7F
1835584 1835584 001C0240
14679679 14679679 00DFFE7F
5507832 5507832 00540AF8
14155775 14155775 00D7FFFF
Aide toi, le ciel ou FantasPic t'aidera

Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités