Bonjour à tous,

je bosse actuellement sur un petit projet de réception de trame hexa par liaison serie.
j'envoie donc une trame du type "03 1E 17" sans les espace et j'ai une réponse du style: "03 00 00 3A 17 1E 41". 03 veut dire que c'est une lecture de variable
00 00 3A 17 c'est l'adresse et 1E 41 c'est la donnée à récupérer en l'occurrence une température dans mon programme.

mon programme principale:

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
void main (void)
{
	char *chaineRecue;
    chaineRecue=new char[200];   
 
	char chaineEnvoie[50];
	char Presence[2];
	int TimeoutRead = 100; // timeout en ms
	COMMTIMEOUTS tTimeout;
	int Select,Envoyer,CheckInit,Etat;
	char Temp[5];
	int id,i;
 
 
 
	/***Ouverture du port de communication***/
	hSerie=CreateFile(TEXT("COM1"),						//Nom du port
					  GENERIC_READ|GENERIC_WRITE,	//permet l'ecriture et la lecture sur le port
					  0,							//Mode de partage
					  NULL,							//Option de sécurité par défaut
					  OPEN_EXISTING,				
					  0,
					  NULL);
 
	std::cout<<"Connection en cours...\n";
	CheckInit=init_serie(); // initialise le port serie
 
 
	/***configurer le timeout***/
	tTimeout.ReadIntervalTimeout = MAXWORD;
	tTimeout.ReadTotalTimeoutMultiplier = 0;
	tTimeout.ReadTotalTimeoutConstant = TimeoutRead; // pas de time out = 0
	tTimeout.WriteTotalTimeoutMultiplier = 0;
	tTimeout.WriteTotalTimeoutConstant = 0;
	SetCommTimeouts(hSerie,&tTimeout);
 
	/*verifier la présence de la carte*/
	Presence[0]=0xAAu;
	Presence[1]='\0';
	Envoyer=SendTrame(Presence);
	Etat=ReceiveTrame(chaineRecue);
 
	if(chaineRecue[0]==Presence[0])
		std::cout<<"\nCarte presente\n";
	else
		std::cout<<"\nCarte absente\n";
 
 
	system("pause");
	/*********************************/
 
 
		do
		{
			system("cls");
			std::cout<<"\nVariable a observer: \n\t-[1] Alarme voyant \n\t-[2] Temperature air ";
			std::cout<<"\nSaisir un chiffre puis appuyer sur entree ";
			std::cin>>Select;
 
			switch(Select)
			{
				case 1:
					chaineEnvoie[0]=0x03; //lecture d'une variable prédéfinie
					chaineEnvoie[1]=0x02;
					chaineEnvoie[2]=0x01;
					chaineEnvoie[3]='\0';
					break;
				case 2:
					chaineEnvoie[0]=0x03;
					chaineEnvoie[1]=0x1E;
					chaineEnvoie[2]=0x02;
					chaineEnvoie[3]='\0';
					break;
				default:
					std::cout<<"\nErreur de saisie";					
			}
 
			Envoyer=SendTrame(chaineEnvoie);
 
			if(Envoyer==1)
			{
				printf("\nReception: \n");
				Etat=ReceiveTrame(chaineRecue);
 
			}
			switch(Select)
			{
				case 1:
					if(chaineRecue[5]==0x00)
						std::cout<<"\nAlarme eteinte";
					break;
				case 2:
 
					//sprintf(Temp,"%s%s",(unsigned char)chaineRecue[5],(unsigned char)chaineRecue[6]);
					printf("Temp (hex): %02X%02X --- %X",(unsigned char)chaineRecue[5],(unsigned char)chaineRecue[6],Temp);
					printf("\nTemperature air= %d%cC",&Temp,167);
					break;
				default:
					std::cout<<"\nErreur de saisie";					
			}
 
			std::cout<<"\nAppuyer sur une touche pour continuer ou sur 'Echap' pour quitter\n";
		}
		while(_getch()!=27);
 
	delete[] chaineRecue;
	CloseHandle(hSerie); // ferme le port
 
}
la fonction de reception:

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
int ReceiveTrame(char *ChaineRecue)
{
 
	BOOL bResult;	
	unsigned long nBytesRead(0);
	char *inBuffer;
	int a,i;
	int id;
 
 
	inBuffer  = new char[200]; // réservation mémoire pour le buffer de récéption
	sprintf(inBuffer,"%s","");
 
	bResult=ReadFile(hSerie,inBuffer,199,&nBytesRead,NULL);
 
	if(nBytesRead>0)
	{
		for(i=0;i<=nBytesRead-1;i++)
			printf(" %02X",(unsigned char)inBuffer[i]); //permet de visualiser la chaine Reçue
	}
	printf("\nNombre d' octet re%cu:%ld \n",135,nBytesRead);
 
	if (nBytesRead==0)
	{
		printf("Pas de donnee recue\n") ;
	}
 
	sprintf(ChaineRecue,"%s",inBuffer); // Retourne la chaine reçue
	if(nBytesRead>0)
	{
		for(i=0;i<=nBytesRead-1;i++)
			printf(" %02X",(unsigned char)ChaineRecue[i]); //permet de visualiser la chaine Reçue 2
	}
	delete[] inBuffer;// Libération de la mémoire
 
	return(0);
 
 
}
donc passons au problème

dans la fonction réception je fais afficher une première fois la trame reçu et sa correspond tout à fait à ce que je reçoit. Cette trame ce trouvant dans le buffer je la met dans ChaineRecue et la quand je fais afficher de nouveau la trame il y a que le début qui correspond "03 00" la suite c'est totalement aléatoire.

Dans un second temps je souhaiterai récupérer l'information se trouvant dans les 2 derniers octet et les afficher en decimal mais là je bloque total
j'ai essayer avec sscanf, sprintf.... la variable Temp est toujours de la forme 17FE38.

A+