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

Probleme avec String comparaison strncmp
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 30 juil. 2016 19:53

Bonsoir,

pour eviter une grosse perte de temps qui ne vous serait pas imputable !

Attention!! ATTENTION

Je me suis encore fait avoir avec
strncmp comparaison de string !
il y a un bug latent dans cette fonction, qui ne semble marcher que si le code n'est pas trop grand
franchissement de page ?

:shock: Toujours est-il que MikroE ne fait rien pour arranger cela ..


Le test , portant sur l'envoi de la trame suivante
$$GPGGA,205905.000,3426.4475,N,03550.2643,E,1,08,1.2,48.1,M,22.9,M,,0000*69#013

envoyée depuis le terminal sur RX UART1 en mode interrupt
Rx Interrupt remplit le buffer1 jusqu'à rencontrere CR =13
nota: avec Vbray terminal certains caracteres speciaux $,#,& sont à dédoubler pour etre envoyés tel quel.

Le test suivant , permettant de detecter l'arrivée d'une trame GPS, ne passait jamais

Code : Tout sélectionner

  //  if(strncmp(&buffer1[0],"$GPGGA,7) == 0)      

alors que bien des exemple MikroE sont basé sur une comparaison directe RAM et Texte en dur

en utilisant la comparaison RAM <-> RAM , c'est OK


Code : Tout sélectionner


 if 
( UART1_DataReady==1)
     {
       RAZ_UART2();
       UART1_Write_CText("UART1 Recu : ");
       UART1_Write_Text(buffer1);
       CRLF1();
     
   
// ...
              // reception GPS
          strConstRamCpy(CRam1,"$GPGGA,");
         if(strncmp(&buffer1[0],CRam1,7) == 0)    // OK
          {
               j = 0;
               flag=0;
               UART1_Write_CText("Trame GPS recue :\r\n");
           ... etc     


j'avais déja signalé ce probleme
En faisant une nouvelle recherche sur le site de MikroC pro
j'ai trouvé ceci à propos de strcmp cette fois ..

où on entrevoit que l'usage de RAM et ROM peut causer probleme
One should pay attention that PIC is Harvard architecture where ROM and RAM are separated.
They have different buses and not addressed continuously.
It will be ambiguous to the compiler if the pointer or data is not specified to be ROM.
By default (without the const keyword), pointers will have its address pointed to RAM.
mikroC should have sent at least a warning when assigning a ROM space variable to a RAM pointer.




Code : Tout sélectionner



// fonction réecritue pour palier à ceci
unsigned char strcmp_P(char *ram_str, const char *rom_str){
  char diff,c;
  while((= *rom_str++)){
    diff = *ram_str++ - c;
    if(diff)
      return diff;
  }
  return 0;
}
 




Attention aussi à un autre piege .. si on detecte la fin de message par CR
si un terminal envoie LF CR au leu de CR LF .. !
Aide toi, le ciel ou FantasPic t'aidera

Probleme avec String comparaison strncmp
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » sam. 30 juil. 2016 22:49

Merci encore Paul pour ce retour d'expérience ! :bravo:
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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