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 ---
- 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 ---
Modérateur : Jérémy
Probleme avec String comparaison strncmp
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonsoir,
pour eviter une grosse perte de temps qui ne vous serait pas imputable !
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 ?
Toujours est-il que MikroE ne fait rien pour arranger cela ..
Le test , portant sur l'envoi de la trame suivante
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
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
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
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 .. !
pour eviter une grosse perte de temps qui ne vous serait pas imputable !
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 ?
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((c = *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 .. !
Probleme avec String comparaison strncmp
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 26 invités