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
Ecran tactile autour d'un PIC18F87J50
Ecran tactile autour d'un PIC18F87J50
Ecran tactile autour d'un PIC18F87J50
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ,
Je fais un petit hors sujet, car j'ai a peu prêt réussis a afficher mes valeurs, mais sans réellement comprendre ! j'ai donc continuer à faire des tests pour me familiariser avec ceci, mais je perds pieds et confond tout .
Si je ne met pas de terminateur de string, ce sera donc la longueur de mon conteneur ( tableau) qui devrait faire office de fin de string ? Comme a chaque lecture de mon buffer en réception min index_buffer est remis à zéro, je devrais écrire par dessus l'ancien texte ( ayant pris soin de l'effacer avant ). et pour tant j'observe des bugs
Je fais un petit hors sujet, car j'ai a peu prêt réussis a afficher mes valeurs, mais sans réellement comprendre ! j'ai donc continuer à faire des tests pour me familiariser avec ceci, mais je perds pieds et confond tout .
Si je ne met pas de terminateur de string, ce sera donc la longueur de mon conteneur ( tableau) qui devrait faire office de fin de string ? Comme a chaque lecture de mon buffer en réception min index_buffer est remis à zéro, je devrais écrire par dessus l'ancien texte ( ayant pris soin de l'effacer avant ). et pour tant j'observe des bugs
Ecran tactile autour d'un PIC18F87J50
- sylvain54
Amateur- Messages : 194
- Âge : 51
- Enregistré en : août 2015
- Localisation : Dans l'est de la France
Salut,
Je ne peux vraiment pas t'aider sur ce sujet,
J'ai des écrans TFT (proto TFT et easy TFT) mais Je n'ai pas de PIC18F87J50.
Je n'ai que des 18F4620, 18F4550, 18F45K22. Ces pics ne sont pas assez performants pour faire tourner un TFT (normalement). J'ai des PIC24, mais après cela ne sera plus comparable par rapport au 18F87J50.
Bon courage.
++
Je ne peux vraiment pas t'aider sur ce sujet,
J'ai des écrans TFT (proto TFT et easy TFT) mais Je n'ai pas de PIC18F87J50.
Je n'ai que des 18F4620, 18F4550, 18F45K22. Ces pics ne sont pas assez performants pour faire tourner un TFT (normalement). J'ai des PIC24, mais après cela ne sera plus comparable par rapport au 18F87J50.
Bon courage.
++
Ecran tactile autour d'un PIC18F87J50
Salut
Il n'y a ni chaîne ni string en C, il n'y a que des tableaux de caractères !
Ensuite on a créé des fonctions de type strlen(), strcpy() qui ne marchent que sur des suites de caractères terminées par un octet nul. On appelle chaîne ces suites de caractères, et elles sont forcément incluses dans un tableau de caractères. Si on applique ces fonctions à une chaîne non finie par un octet nul, le pire peut arriver ! (car ce n'est pas une chaîne en fait)
Si le tableau char tab[9] contient "abc0de0fg" (les deux 0 étant des octets nuls, pas des caractères '0')
Ce tableau tab contient les 6 chaînes -> "abc" "bc" "c" "de" "e" ""
strlen(tab) -> 3 (chaîne "abc")
strlen(&tab[1]) -> 2 (chaîne "bc") autre syntaxe -> strlen(tab+1)
strlen(&tab[2]) -> 1 (chaîne "c")
strlen(&tab[3]) -> 0 (chaîne "")
strlen(&tab[4]) -> 2 (chaîne "de")
strlen(&tab[5]) -> 1 (chaîne "e")
strlen(&tab[6]) -> 0 (chaîne "")
strlen(&tab[7]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[8]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[9]) -> résultat indéterminé ou plantage, car on est en dehors du tableau
Si tu mets un octet nul dans le tableau, tu crées une fin de chaîne (il peut y en avoir d'autres comme dans l'exemple). Les caractères qui suivent cet octet nul sont inchangés, et si ton tableau n'a aucun octet nul, il ne contient aucune chaîne.
si je fais strcpy(tab, "xy"); le tableau va passer de "abc0de0fg" à "xy00de0fg"
le strcpy a copié les octets, ajouté l'octet nul de fin de chaîne, et n'a pas touché aux 6 derniers octets. car il se fout de savoir ce qu'il y avait dans le tableau avant, et il ne se sait pas non plus la taille du tableau, alors gare au plantage si tu dépasses sa taille, la manipulation de chaînes en C, c'est sans garde-fou ...
Il n'y a ni chaîne ni string en C, il n'y a que des tableaux de caractères !
Ensuite on a créé des fonctions de type strlen(), strcpy() qui ne marchent que sur des suites de caractères terminées par un octet nul. On appelle chaîne ces suites de caractères, et elles sont forcément incluses dans un tableau de caractères. Si on applique ces fonctions à une chaîne non finie par un octet nul, le pire peut arriver ! (car ce n'est pas une chaîne en fait)
Si le tableau char tab[9] contient "abc0de0fg" (les deux 0 étant des octets nuls, pas des caractères '0')
Ce tableau tab contient les 6 chaînes -> "abc" "bc" "c" "de" "e" ""
strlen(tab) -> 3 (chaîne "abc")
strlen(&tab[1]) -> 2 (chaîne "bc") autre syntaxe -> strlen(tab+1)
strlen(&tab[2]) -> 1 (chaîne "c")
strlen(&tab[3]) -> 0 (chaîne "")
strlen(&tab[4]) -> 2 (chaîne "de")
strlen(&tab[5]) -> 1 (chaîne "e")
strlen(&tab[6]) -> 0 (chaîne "")
strlen(&tab[7]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[8]) -> résultat indéterminé ou plantage, car pas d'octet qui indique la fin de chaîne
strlen(&tab[9]) -> résultat indéterminé ou plantage, car on est en dehors du tableau
Si tu mets un octet nul dans le tableau, tu crées une fin de chaîne (il peut y en avoir d'autres comme dans l'exemple). Les caractères qui suivent cet octet nul sont inchangés, et si ton tableau n'a aucun octet nul, il ne contient aucune chaîne.
si je fais strcpy(tab, "xy"); le tableau va passer de "abc0de0fg" à "xy00de0fg"
le strcpy a copié les octets, ajouté l'octet nul de fin de chaîne, et n'a pas touché aux 6 derniers octets. car il se fout de savoir ce qu'il y avait dans le tableau avant, et il ne se sait pas non plus la taille du tableau, alors gare au plantage si tu dépasses sa taille, la manipulation de chaînes en C, c'est sans garde-fou ...
Ecran tactile autour d'un PIC18F87J50
Ecran tactile autour d'un PIC18F87J50
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
tu as un joli bug !
=> NON , pas dans ce cas avec %3u
occupe > 50 bytes ...> OVERFLOW
la table p_Variable explose des la 4em valeur => bazar dans le programme
puisque stocke 6 car par valeur ( unsigned int)
Verifiable en mode debugger et tracage des variables.
sprintf ne sait pas afficher des bytes (octets) en hexadecimal
ex:
spintf(P_variable,"%2X....
il lui faut un ENTIER comme argument
sprintf(P_Variable,"%2X ... ",(int)var1,
j'avais déja signalé cette anomalie sur MikroE Forum, ne suit pas la norma ANSI C .
il en est de meme pour le parametre %3u le u unsigned doit etre un entier et non un byte
donnera le resultat escompté .
tu as un joli bug !
Code : Tout sélectionner
char P_Variable[32];
unsigned char var0=100, var1=101,var2=102, var3=103, var4=104, var5=105, var6=106, var7=110;
sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",var0,var1,var2,var3,var4,var5,var6,var7);
8x3=24 + 7 espaces=31 + zero terminateur
=> NON , pas dans ce cas avec %3u
occupe > 50 bytes ...> OVERFLOW
la table p_Variable explose des la 4em valeur => bazar dans le programme
puisque stocke 6 car par valeur ( unsigned int)
Verifiable en mode debugger et tracage des variables.
sprintf ne sait pas afficher des bytes (octets) en hexadecimal
ex:
spintf(P_variable,"%2X....
il lui faut un ENTIER comme argument
sprintf(P_Variable,"%2X ... ",(int)var1,
j'avais déja signalé cette anomalie sur MikroE Forum, ne suit pas la norma ANSI C .
il en est de meme pour le parametre %3u le u unsigned doit etre un entier et non un byte
Code : Tout sélectionner
sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7);
donnera le resultat escompté .
Ecran tactile autour d'un PIC18F87J50
Ecran tactile autour d'un PIC18F87J50
Ecran tactile autour d'un PIC18F87J50
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Je viens d'essayer
Je ne trouve pas de changement. Ca bug encore pour l'affichage du mot "Compteur+" sur le lcd ; il se déplace et s’inscrit partout sur le LCD .
Je suis obligé de le placé après le sprintfpour ne pas avoir de bug.
Pour avoir un comportement correct voici mon bout de code :
if (((BP6==1) && (UART1_Tx_Idle() == 1))) // Check le BP6 et le buffer
{
var0++; var1++; var2++; var3++; var4++; var5++; var6+=100; var7+=1000; // On incremente nos compteurs
Lcd_Out (1, 8,"COMPTEUR+"); // On l'affiche sur le LCD de l'emettteur
sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7); // On convertit
UART1_Write_Text(P_Variable); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
delay_ms(80);
}
Je ne trouve pas de changement. Ca bug encore pour l'affichage du mot "Compteur+" sur le lcd ; il se déplace et s’inscrit partout sur le LCD .
Je suis obligé de le placé après le sprintfpour ne pas avoir de bug.
Pour avoir un comportement correct voici mon bout de code :
Code : Tout sélectionner
if (((BP6==1) && (UART1_Tx_Idle() == 1))) // Check le BP6 et le buffer
{
var0++; var1++; var2++; var3++; var4++; var5++; var6+=100; var7+=1000; // On incremente nos compteurs
sprintf(P_Variable,"%3u %3u %3u %3u %3u %3u %3u %3u",(int)var0,(int)var1,(int)var2,(int)var3,(int)var4,(int)var5,(int)var6,(int)var7); // On convertit
Lcd_Out (1, 8,"COMPTEUR+"); // On l'affiche sur le LCD de l'emettteur
UART1_Write_Text(P_Variable); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
delay_ms(80);
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 36 invités