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.