Je vais essayer la manipe.
Je vais essayer la manipe.
Je n'arrive pas à résoudre le problème de la récupération de la chaine pour la découper et récupérer la partie qui m'interresse. J'ai placé ma trame dans la variable c
int c;
c = inportb(THR_RBR);
à partir de là je bloque. Je ne peut pas utiliser strcpy car je ne peux pas copier du int dans du char. Peut tu m'aider?
Ce que tu as mis dans c, c'est pas une trame, c'est un caractère.Envoyé par 202UH
Il faut définir au préalable un tableau de char de taille suffisante pour stocker la trame avec un 0 final et un indice à 0.
A chaque caractère reçu, tu places ce caractère dans le tableau à l'aide de l'indice et tu augmentes l'indice de 1 (si on atteint les limites, c'est qu'il y a un bug : EOL jamais reçu. Purger, c'est à dire remettre i a 0).
Quand tu reçois EOL, tu mets un 0 à la place, tu appelles la fonction de traitement de la chaine et tu remets l'indice à 0.
Fait de ton mieux et ecrit l'algorithme puis le code et poste le tout en cas de problèmes.
Il faut absolument m'aider. Je dois finir ce prog pour cette semaine et on va être vendredi. Si quelqu'un peut me donner la solution, se serai sympa. Il est 22 h est je vais arrêter pour aujourd'hui. Voilà ou j'en suis, alors ne croyer pas que j'attends les réponse toutes finis en me tournant les pouces. Mais je suis réellement bloqué. Merci d'avance...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #define EOL 10 int c; fin = 0; while (!fin) { if (inportb (LSR) & 0x01) /* LSR.0 : Data Ready */ { clrscr(); c = inportb (THR_RBR); /* Permet de vider le tampon */ char tableau[41]; while ( (c = getc()) != EFO) { /* je ne trouve pas la formule pour ecrire ds le tableau */ c = c++ } if ( (c = getc()) == EFO) /* simulation de la reception */ // strcpy (data, "<16>:(PB): 1665 l/h"); /* extraction de la chaine de resultat : */ // char resultat[6] = ""; // strncat (resultat, data + 11, 5); // printf("%s",resultat); } }
Tu pourrais au moins poster du code complet... ou alors si c'est du pseudo-code, précise le... Ca ne dispense pas des balises code...Envoyé par 202UH
Je reprends l'algorithme textuel, et je m'en sers pour écrire le pseudo code :
Il a fallut légèrement modifier l'ordre de l'algorithme textuel pour arriver à construire un algorithme formel cohérent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 BEGIN ; Il faut définir au préalable un tableau de char de taille suffisante pour ; stocker la trame avec un 0 final trame : ARRAY 0..40 OF character ; et un indice à 0. indice := 0 ; A chaque caractère reçu, LOOP c = reception_caractere(); ; Quand tu reçois EOL, IF c = EOL ; tu mets un 0 à la place, trame[indice] := 0 ; tu appelles la fonction de traitement de la chaine traitement (trame) ; et tu remets l'indice à 0. indice := 0 ELSE ; tu places ce caractère dans le tableau à l'aide de ; l'indice trame[indice] := c ; et tu augmentes l'indice de 1 indice := indice + 1 ; (si on atteint les limites, IF indice > 40 ; c'est qu'il y a un bug : EOL jamais reçu. ; Purger, c'est à dire remettre i a 0). indice := 0 ENDIF ENDIF END LOOP END
Voilà. Le travail de reflexion (conception) est terminé. Reste plus que le codage...
Je vais faire de mon mieux et essayer de trouver les bon codes. Merci...
Voilà le codage que j'ai fais. Il y a encore un problème. Pourrais-tu m'indiquer ce que je dois corriger?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /***********************/ /* Boucle de rception */ /***********************/ #define ELO 10 fin = 0; char trame_lue[41]; int c; int i = 0; if (inportb (LSR) & 0x01) c = inportb (THR_RBR); if (c == ELO) { trame_lue[41] = 0; char resultat[6] = ""; strncat (resultat, trame_lue + 11, 5); printf("%s", resultat); i = 0; } else { trame_lue[i] = c; i = i+1; } if (i > 41) i = 0;
J'ai modifier mon source en rajoutant une boucle while comme ci-dessous. Mais rien ne s'affiche à l'écran. J'ai repris le (!fin) que tu avais mis dans tes premier code. Est ce que fin signifie fin de la chaine de caractères? Faut-il le remplacer par (!EOL)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 /***********************/ /* Boucle de rception */ /***********************/ #define ELO 10 fin = 0; char trame_lue[41]; int c; int i = 0; while (!fin) { if (inportb (LSR) & 0x01) c = inportb (THR_RBR); } if (c == ELO) { trame_lue[41] = 0; char resultat[6] = ""; strncat (resultat, trame_lue + 11, 5); printf("%s", resultat); i = 0; } else { trame_lue[i] = c; i = i+1; } if (i > 41) i = 0;
comme indiqué dans les règles du forum. C'est fatiguant de répéter toujours les même choses...Envoyé par 202UH
Elle est où la boucle ? L'initialisation de l'index doit être fait en dehors da la boucle, comme indiqué dans l'algorithme./* Boucle de r‚ception */
/***********************/
#define ELO 10
fin = 0;
char trame_lue[41];
int c;
int i = 0;
Ceci doit être dans le else. Pourquoi tu ne suis pas l'algorithme ? Sauf erreur de ma part, l'étude est terminé. Il n'y a plus qu'à coder l'algorithme fidèlement. et à le tester. Si tu codes autre chose, on est dans l'inconnu et on ne peut rien vérifier.if (inportb (LSR) & 0x01) c = inportb (THR_RBR);
if (c == ELO)
{
trame_lue[41] = 0;
char resultat[6] = "";
strncat (resultat, trame_lue + 11, 5);
printf("%s", resultat);
i = 0;
}
else
{
trame_lue[i] = c;
i = i+1;
}
if (i > 41) i = 0;
}Voilà. Aucun mystère, il suffisait de suivre le pseudo-code à la lettre Si ce code ne fonctionne pas, c'est soit qu'il est mal codé (je ne peux pas le compiler ni le tester) soit que l'algorithme est faux (tout est possible, je n'ai pas de moyens de valider), soit que le port série, la liaison ou le capteur ne fonctionnent pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #include <string.h> #include <stdio.h> /* a completer, je n'ai pas de <dos.h> */ #define ELO 10 int main (void) { /* BEGIN */ /* trame : ARRAY 0..40 OF character */ char trame_lue[41]; /* indice := 0 */ int i = 0; /* LOOP */ for (;;) { int c; /* c = reception_caractere() */ while ((inportb (LSR) & 0x01) == 0) { } c = inportb (THR_RBR); /* IF c = EOL */ if (c == ELO) { /* trame[indice] := 0 */ trame_lue[i] = 0; /* traitement (trame) */ { char resultat[6] = ""; strncat (resultat, trame_lue + 11, 5); printf ("%s", resultat); } i = 0; /* indice := 0 */ /* ELSE */ } else { /* trame[indice] := c */ trame_lue[i] = c; /* indice := indice + 1 */ i = i + 1; /* IF indice > 40 */ if (i > 41) { /* indice := 0 */ i = 0; /* ENDIF */ } /* ENDIF */ } /* END LOOP */ } /* END */ return 0; }
Mais je suis un peu désespéré, car je n'ai pas l'impression que mes conseils servent à quoi que ce soit... et c'est très désagréable d'avoir l'impression de parler dans le vide... Si tu voulais m'extorquer du code, tu as gagné, mais tu n'auras pas appris grand chose tant que ça ne viendra pas de toi...
J'ai dit.
Je fais de mon mieux et j'ai suivit tes derniers conseilles dans le dernier programme. Par contre je pense ne pas t'extorquer les codes comme tu dis. J'ai juste du mal a comprendre le fonctionnement pour enregister ma trame dans un table et récupérer le résultat qui m'interesse et c'est normale car quand on est débutant, on ne peut tout savoir. Si vraiment je voulais t'extorquer les codes, je ne me casserais pas la tête le soir jusqu'a 22 heures. J'attendrai que ça se passe et que quelqu'un finisse par me donner la solution toute finie. Si le dernier codage ne correspond pas à ce que tu m'as indiquer, alors explique mois ou j'ai fais l'erreur!
22h, arf... A minuit j'y étais encore, et depuis 8 heures du matin...Envoyé par 202UH
Tu n'as tout simplement pas suivi l'algorithme tel que je l'ai écrit.Si le dernier codage ne correspond pas à ce que tu m'as indiquer, alors explique mois ou j'ai fais l'erreur!
Si tu ne le comprends pas, pose des questions...
Je vais tout reprendre calmement et on verra. En tous cas, je ne suis pas un profiteur, sache le. Merci et à plus.
A part mettre au point le code que j'ai posté, je ne vois pas trop ce qu'il y a à reprendre. Je croyais que ça devais être fini aujourd'hui ? On m'aurait menti à l'insu de mon plein gré ?Envoyé par 202UH
Ca ne t'a pas empêché de sortir les violons hier soir... voire de donner des ordres...En tous cas, je ne suis pas un profiteur, sache le. Merci et à plus.
Il faut absolument m'aider. Je dois finir ce prog pour cette semaine et on va être vendredi.
J'ai corrigé le code.Envoyé par 202UH
Je n'ai pas sorti de violon et je n'ai pas donné d'ordre, je demande que de l'aide. Enfin, comme tu peux voir, j'ai appliqué à la lettre ton codage et je l'ai placé dans une fenêtre code . La compile ne m'a pas généré d' erreur. Mais lorsque je lance l'exe, il se referme de suite. Comment parer ce problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 #include <stdio.h> #include <conio.h> #include <STRING.H> /****************************/ /* Registres UART port COM2 */ /****************************/ #define ESC 0x1b #define THR_RBR 0x2F8 #define IER 0x2F9 #define IIR 0x2FA #define LCR 0x2FB #define MCR 0x2FC #define LSR 0x2FD #define MSR 0x2FE /****************************/ /* Paramtres de la liaison */ /****************************/ #define DONNE_8 0x03 #define STOP_1 0x00 #define NONE 0x00 #define DLAB 0x80 #define RAZ_DLAB 0x7F #define _9600_BAUDS 12 #define INTR 0x23 unsigned char init_liaison; int fin; /************************/ /* Programme principale */ /************************/ void main() { clrscr(); /*****************************************************************/ /* Init port srie : 8 bits donnes, 1 bit stop, parit aucune, */ /* 9600 bauds et positionnement de DLAB pour faire la slection */ /* de la vitesse de transmission */ /*****************************************************************/ outportb(IER,0x01); init_liaison = DONNE_8|STOP_1|NONE|DLAB; outportb(LCR,init_liaison); /**************************************************************/ /* Configuration de la vitesse 9600 bauds et RAZ bit 7 du LCR */ /**************************************************************/ outportb(THR_RBR,_9600_BAUDS); init_liaison &= RAZ_DLAB; /**********************************************************************/ /* Envoie nouveau la configuration au LCR avec le bit 7 (DLAB) 0 */ /**********************************************************************/ outportb(LCR,init_liaison); /***********************/ /* Boucle de rception */ /***********************/ /* Declaration des variables et de la trame mise a 0 de l'indice */ #define EOL 10 char trame_lue[41]; int i = 0; /* boucle for */ for (i=0;i<41;i++) { /* reception caractere*/ int c; if (inportb (LSR) & 0x01) { c = inportb (THR_RBR); } /* Si End Of Line atteint */ if (c == EOL) { /* Traitement de la trame */ trame_lue[i] = 0; { char resultat[6] = ""; strncat (resultat, trame_lue + 11, 5); printf ("%s", resultat); } i = 0; } else { trame_lue[i] = c; i++; } if (i > 40) { i = 0; } } return; }
Je ne me souviens pas avoir parlé de boucle for dans l'algorithme, mais de boucle tout court, c'est à dire sans condition de sortie, ce que j'ai codé :Envoyé par 202UH
Je reviens vers 18:00
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 /* LOOP */ for (;;) { <...> /* END LOOP */ }
Ca se trouve un peut plus haut sir la page 4 dans ton code.
Dois-je réutiliser (!fin)? Que représente se fin. Merci.../* LOOP */
for (;;)
{
Ben oui, je l'ai même cité. Mais je n'ai pas parlé de variable ni d'expression concernant ce for. As-tu compris le rôle de la boucle (LOOP-END-LOOP codée en C for(;;){} ou while(1){}, mais c'est plus long à taper... )Envoyé par 202UH
C'est un autre problème. La boucle inconditionnelle (for(;;){}) ne s'arrête jamais. C'est acceptable pour ton programme, car tu n'as pas précisé comment il s'arrêtait. Mais si tu veux qu'il s'arrête sur appui d'une touche genre ESC ou Alt-F4, il faut le préciser dans la spécification et on ajoutera le bout de code qui va bien...Dois-je réutiliser (!fin)? Que représente se fin.
Pour le moment, tu laisses for(;;).
Si j'ai bien compris ce que j'ai fais, je résumerai ça de cette façon :
Comme ma trame est toujour la même, j'aurrai au maximum 41 cases dans mon tableau (0...40), y compris le end of line. Donc pour ranger mes 41 cases, une incrémentation de 40 sur un indice = 0 me font bien 41 rangements pour mes caractères. Puis je quitte la boucle avec mes 41 traitements de fait.
C'est vrai que actuellement je quitte le programme d'une façon assez sauvage qui ne me plait pas du tout (clic sur la croix de fermeture de la fenêtre, puis clic sur le message "Terminer maintenant"). Pourrais tu m'expliquer comment programmer une sortie du programme par une combinaison que moi je définirai (ex : Ctrl + P + S). Si je peux choisir mes touches à additionner à Ctrl, je serai sur de ne pas perturber le Second programme qui lui à de multiples combinaisons de touches. Le programme que j'essais de mettre au point avec ton aide tournera en fond de tâche. C'est en fait un Thread.
Si tu te rappels le début de cette discution, je te parlais d'un soft de supervision WinCC. J'ai trouvé la solution pour afficher le résultat de ma trame dans une fenêtre I/O de ce soft. Je vais finir le programme par un enregistrement du résultat dans un fichier texte et la fenêtre I/O de WinCC permet la récupération de valeurs écrites dans un fichier txt.
Je vais commencer à étudier l'enregistrement de la valeur dans un fichier txt (fopen,fwrite,fclose... d'après les premiers éléments que j'ai pu trouver).
Si tu peux me tenir au courant pour la fermeture du programme proprement, ce serais sympa. Merci beaucoup.
PS Si je t'ai parlé que le programme devait être fini aujourd'hui, je ne t'ai pas raconté de conneries. C'est un impératif que je me suis imposé car il ne me reste plus que 2 semaines de stage pour rédiger mon rapport. Le 11/12/06 je passe mes exames est je serai interrogé sur mon stage, ce que j'ai fais pendant mon stage et ce que j'ai compris. Tu comprends un peut mieux mon stress.
Le week end je ne peut pas accéder à l'entreprise pour les essais, mais j'aimmerai être Ok pour Lundi matin avec l'enregistrement dans un fichier.
On en sait rien... On sait juste qu'elle ne doit pas faire plus de 41 caractères y compris le EOL.Envoyé par 202UH
Non. Y compris le 0 final de fin de trame. Le EOL n'est pas enregistré. Il sert à déclencher 3 opérations :j'aurrai au maximum 41 cases dans mon tableau (0...40), y compris le end of line.
- Terminer la chaine reçue par un 0 de façon à ce qu'elle puisse être traitée par des fonctions C standards.
- Lancer le traitement de la-dite chaine
- Remettre l'indice à 0. (réinitialiser l'acquisition pour être prêt à la saisie suivante.).
Tout ceci a déjà été expliqué dans l'algorithme textuel, dans le pseudo-code et codé tel quel...
Rien ne dit que le capteur va envoyer exactement 41 caractères. Il en envoi un certain nombre, peu importe combien et quand c'est EOL, on sait que c'est fin. Mais on a une sécurité. Si au bout du 41ème, on a toujours pas reçu le EOL, les caractères reçus précédemment sont ignorés et on relance l'acquisition de la trame suivante. On a déjà expliqué tout ça...Donc pour ranger mes 41 cases, une incrémentation de 40 sur un indice = 0 me font bien 41 rangements pour mes caractères. Puis je quitte la boucle avec mes 41 traitements de fait.
Si tu as <conio.h>, getch(), kbhit(), aucun problème. J'attends ta confirmation.C'est vrai que actuellement je quitte le programme d'une façon assez sauvage qui ne me plait pas du tout (clic sur la croix de fermeture de la fenêtre, puis clic sur le message "Terminer maintenant"). Pourrais tu m'expliquer comment programmer une sortie du programme par une combinaison que moi je définirai (ex : Ctrl + P + S).
Aucune importance. Sous Windows, seul le programme qui a le focus est sensible au clavier. (Heureusement, tu vois le cirque ? Je fais ctrl-F4, toutes les applications se ferment. Bravo !)Si je peux choisir mes touches à additionner à Ctrl, je serai sur de ne pas perturber le Second programme qui lui à de multiples combinaisons de touches.
Tâche de fond...Le programme que j'essais de mettre au point avec ton aide tournera en fond de tâche.
What ? A ma connaissance, un thread tourne en Win32, pas en Win16. Je te rappelle que le code en question n'est pas du tout compatible Win32. Tu as insisté pour accéder directement à l'UART, mais je t'avais bien prévenu que ça ne fonctionnais que sous DOS (disons en mode réel vrai ou ou réel simulé par la VM 16-bit des anciens Windows avant 98SE).C'est en fait un Thread.
Et tu l'as essayé ça, avec <dos.h>, inportb() etc ? Ca compile ? Ca fonctionne ?Si tu te rappels le début de cette discution, je te parlais d'un soft de supervision WinCC. J'ai trouvé la solution pour afficher le résultat de ma trame dans une fenêtre I/O de ce soft.
C'est pas dur. Pour éviter les bêtises, je suggère une ouverture en mode "a" (text append) avec fopen(), puis un enregistrement (fprintf() et une fermeture immédiate (fclose()), le tout à chaque traitement de la chaine (EOL detected). C'est un peu le B.A. BA du C, que tu n'as pas l'air de conaitre...Je vais finir le programme par un enregistrement du résultat dans un fichier texte et la fenêtre I/O de WinCC permet la récupération de valeurs écrites dans un fichier txt.
Pas fwrite(). Sans intérêt ici. Tu as fortement interêt à enregistrer en mode texte (genre une valeur par ligne codée en décimal). En fait, c'est ce que t'envoie le capteur. C'est donc même pas la peine de convertir la chaine, tu peux l'enregistrée telle quelle (après extraction).Je vais commencer à étudier l'enregistrement de la valeur dans un fichier txt (fopen,fwrite,fclose... d'après les premiers éléments que j'ai pu trouver).
L'usage des fonctions de gestion des flux est décrit dans ton livre de C et dans les tutoriels sérieux.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager