Bonjour à tous,
J'ai pour projet TPE de programmer un robot en C.
A la base j'ai un programme basic, que j'ai réussi à traduire en français.
J'ai récupéré sur le net un code source pour contrôler le port série, avec la fonction main vide. (On peut faire ce qu'on veut de ce code).
J'ai ensuite créé mon programme pour envoyer des ordres au robot.
Lorsque je relie les broches 2 et 3 du port série (les broches d'émission et de réception), toutes les chaînes de caractères que j'envoie avec le programme sont ensuite reçues. J'en déduis que mon programme fonctionne correctement.
Mon problème : lorsque j'envoie la chaîne {2,'B','O',3,0} au robot (pour l'initialiser), je ne reçois pas la réponse attendue {2,'O',3,0} mais une chaîne bizarre. Je reçois cette même chaîne si je débranche le robot.
J'en déduis : le robot ne reçois pas mes ordres, ou il les reçoit mais mon programme ne peut pas recevoir la réponse, donc problème dans la fonction d'émission, ou de réception.
Voici des codes.
Extrait de la fonction main :
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 char init[]={2,'B','O',3,0}; // chaîne d'initialisation char *pointeur; pointeur = &init; char je_recois[25]; // chaîne qui recoit les caractères envoyés par le robot int max = 25; // nombre maximum de caractères à lire lors de la réception int ai_lu = 0; // rapporte le nombre de caractères lus lors de la réception /* Configuration du port serie : * Communication sur le port COM1 * Débit de 9600 bits/s * 8 bits de données * Pas de bit de parité * 2 bits d'arrêt */ g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_2); /* Envoi de la chaîne qui initialise le robot */ g_ErrCom=EmissionCom(pointeur,sizeof(init)); /*Réception de l'accusé */ g_ErrCom=ReceptionCom(&je_recois ,max, &ai_lu);
Fonction EmissionCom :
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 //---------------------------------------------------------------------------- // FONCTION : EmissionCom //---------------------------------------------------------------------------- // DESCRIPTION : // Emission d'octets sur la liaison série // //---------------------------------------------------------------------------- // PARAMETRES : // -lpBuf Pointeur sur les octets a emettre // -nCount Nombre d'octet a emettre // //---------------------------------------------------------------------------- // RETOUR :Code d'erreur //---------------------------------------------------------------------------- e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount) { DWORD NumBytes=0; if(g_hCom!=NULL) { // On pari sur pas d'erreur g_ErrCom=e_ErrCom_None; //Emission du buffer if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0) { g_ErrCom=e_ErrCom_Emission; } } else //Le port n'a pas été ouvert g_ErrCom=e_ErrCom_Creation; return g_ErrCom; }
La fonction ReceptionCom:
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 //--------------------------------------------------------------------------- // FONCTION : ReceptionCom //--------------------------------------------------------------------------- // DESCRIPTION : // Reception de caractères sur la liaison série // //--------------------------------------------------------------------------- // PARAMETRES : // -lpBuf Pointeur sur le buffer de caractère a lire // -nCountMax Nombre maxi de caractère a lire // -pCountRead Pointeur sur le nombre de caractères lus //--------------------------------------------------------------------------- // RETOUR :Code d'erreur //--------------------------------------------------------------------------- e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead) { COMSTAT Stat; DWORD Errors; unsigned int nCarALire; unsigned long NCarLus=0; if(g_hCom!=NULL) { //on pari sur pas d'erreur g_ErrCom=e_ErrCom_None; //Pour éviter de gérer un time out Sleep(500); //Pour connaitre le nombre d'octets dans le buffer d'entrée ClearCommError(g_hCom,&Errors,&Stat); nCarALire=Stat.cbInQue; //On effectue la lecture si il y a des caractères présents if( (nCarALire>0)&&(nCarALire<=nCountMax) ) { if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0) { g_ErrCom=e_ErrCom_Reception; } } *pCountRead=NCarLus; } else //Le port n a pas été ouvert g_ErrCom=e_ErrCom_Creation; //Compte rendu de l'exécution return g_ErrCom; }
Voilà, j'ai donc du mal à saisir ce qui ne va pas.
Je suis sûr qu'il faut envoyer la chaîne ascii 2 + 'B' + 'O' + ascii 3 (j'ai testé le programme basic).
Merci beaucoup.
S'il vous manque des renseignements, dites le moi.
![]()
Partager