Salut, j'ai réussi à récupérer et analyser les trames qui arrivent. Voici le code. Si ca interesse quelqu'un, vous pouvez me joindre sur mon mail leny@frid.fr
/////////////////////////////////////////////////////////// programme développé sous borland pour carte SC12 ou SC13 avec module DK51
//////////////////////////////////////////////FICHIER PRINCIPAL ///////////////// METEO.CPP
//***** APPLI DK50 AUTHOR : Leny FRID ; DATE : 03/08 ***********
#include "FOSSIL.H"
#include "CLIB.H"
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "METEO.H"
int main()
{
int retStatu1;
int i = 0;
int j = 0;
int a = 0;
unsigned char dummy;
unsigned char meteobuffer[16];
char* grandeur ;
char* signe;
// init fossil --------------------
if( fossil_init( 0 ) != 0x1954 ) // code drivers fossil
{ // il faut le mettre avant le
printf("\r\nInit fossil ERREUR\r\n"); // printf "appli dk50 projet 2008"
}
sleep(1);
//initialisation liaison dk51 - station
fossil_set_flowcontrol( 0, 1 );
printf("\r\n-- PRIMSOL CLIMAT - L.BERNARD - 2008 --\r\n");
printf("\r\n- -\r\n");
// init baudrate ------------------------------------
fossil_setbaud(0,9600, FOSSIL_PARITY_NO, 8, 1);
pfe_enable_pio (10,5); // initialise pio10 en sortie au niveau bas
pfe_enable_pio (9,1); // initialise pio9 en entrée pour qu'il soit capable de lire avant d'émettre
sleep(1);
// purge des buffers entrée et sortie
fossil_purge_output( 0 );
fossil_purge_input( 0 );
retStatu1 = fossil_status_request ( 0 );
if ((retStatu1 && 0x40) == 1 ) // test du bit 6 Buffer empty
{
printf("\rLe buffer est vide\n") ;
}
else
{
printf("\rProbleme, le buffer devrait etre vide\n");
}
// reception et analyse de la trame-----------------------------------------
do
{
i = 0;
dummy = fossil_getbyte_wait ( 0 ); // le getbyte récupere les octets
//envoyés par liaison RS232
meteobuffer[i] = dummy;
if(meteobuffer[0]==0xff) // ON TESTE SI ON A RECU FF 1 FOIS
{
printf( "\n<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
if(meteobuffer[1]==0xff) // ON TESTE SI ON A RECU FF 2 FOIS
{//si on a recu <ff> <ff>, on analyse le troisieme octet pour définir le type de mesure
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
switch (meteobuffer[2]) // en fonction de meteobuffer[2]
{
/////////////////////// VENT ///////////////////////////
case 0:
// on en deduit que c'est le vent
grandeur = "C'est le vent";
j = 10;
// boucle pour récupérer les mesures du vent
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
}while (i < j);
printf( "\n Grandeur mesuree : %s\n\n", grandeur);
//////////////////////// Rafales et vitesse moyenne ////////
capteur_station.vrafvent = ((meteobuffer[5]&0xf0)>>4)+(meteobuffer[6]&0x0f)*10+((meteobuffer[6]&0xf0)>>4)*100;
capteur_station.vmoyvent = (meteobuffer[7]&0x0f)+( (meteobuffer[7]&0xf0)>>4)+(meteobuffer[8]&0x0f)*10;
/////////////// Direction du vent exprimee en ° //////////////
capteur_station.dvent = (meteobuffer[4]&0x0f)+((meteobuffer[4]&0xf0)>>4)*10
+(meteobuffer[5]&0x0f)*100;
printf("Vitesse moyenne du vent : %i\nVitesse des rafales : %i\nDirection du vent : %i\n",capteur_station.vmoyvent, capteur_station.vrafvent, capteur_station.dvent);
break;
/////////////////////// PLUIE ///////////////////////////
case 1:
j = 15;
// on en deduit que c'est la pluie
grandeur = "C'est la pluie";
// boucle pour récupérer les mesures de la pluie
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
}while (i < j);
printf( "\n Grandeur mesuree : %s\n\n", grandeur);
//////////////////////// pluviometrie en mm/h ///////////////
capteur_station.pluv = (meteobuffer[4]&0x0f)+((meteobuffer[4]&0xf0)>>4)*10+(meteobuffer[5]&0x0f)*100;
printf("Pluviometrie : %i mm/h\n",capteur_station.pluv);
break;
/////////////////////// THERMO, HYGRO ///////////////////////
case 3:
j =7;
// on en deduit que c'est la temperature et l'hygrometrie
grandeur = " temperature et de l'hygrometrie";
// boucle pour récupérer les mesures
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%2x> ", meteobuffer[i] ); // On affiche l'octet recu
}while (i < j);
printf( "\n On a la mesure de la%s\n\n", grandeur);
capteur_station.signe =(meteobuffer[5]&0x0f)>>7;
if (capteur_station.signe==0)
{
signe = "+";
}
else
{
signe = "-";
}
capteur_station.temp =((meteobuffer[4]&0xf0)>>4)+(meteobuffer[5]&0x0f)*10+((meteobuffer[5]&0x30)>>4)*100;
capteur_station.temp2 =(meteobuffer[4]&0x0f);
printf("Temperature : %s%i.%i °C\n",signe,capteur_station.temp,capteur_station.temp2);
capteur_station.hygr =(meteobuffer[6]&0x0f)+((meteobuffer[6]&0xf0)>>4)*10;
printf("Hygrometrie : %i %\n",capteur_station.hygr);
break;
default:
// on en deduit que c'est une grandeur que l'on ne traite pas
j = 0;
grandeur = "grandeur non geree, trame suivante";
printf( "\n Grandeur mesuree : %s\n\n", grandeur);
break;
}; // fin switch case
}// fin if recup ff une deuxieme fois
} // fin if recup ff une premiere fois
} // fin do-while general
while(a==0);
}
/////////////////////////////////////////////////////////////////////////////////////INCLUDE FILE METEO.H
//*****************************************************************************/
// Programme primsol climat, par Leny FRID, Avril 2008
//*****************************************************************************/
#ifndef _METEO_H_
#define _METEO_H_
/*****************************************************************************/
/*****************************************************************************/
/*
* definitions Structure
*/
/*****************************************************************************/
struct capteurs_station_tag
{
int vmoyvent; // vitesse des rafales du vent
int vrafvent; // vitesse moyenne du vent
int dvent; // direction du vent exprimee en °C
int temp; // temperature
int temp2; // temperature
int signe; // signe temperature
int hygr; // hygrometrie
int pluv; // pluviometrie
}capteur_station ;
#endif /* __METEO_H__ */
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ne pas oublier de bien parametrer le projet.
Plateform = "dos (standard)",
"no exceptions" pour les librairies,
cocher "class librairy" dans frameworks,
"none" pour match support.
Puis dans les Options --> project, il faut sélectionner un processeur 80186, nécessaire pour l'R-TOS du dk51
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ne pas oublier aussi d'inclure le fichier CLIB2001.lib qui inclut direct tous les fichiers nécessaires (fossil.h, fossil.cpp, api etc...)
Pour in imprim-écran allez ici :
http://www.cppfrance.com/infomsg_LIAISON-RS232-AVEC-DK50_1087404.aspx
Je me concentre maintenant sur la communication socket... si quelqu'un gère bien là-dessus, je veux bien de l'aide... Je souhaiterais envoyer mes données à mon programme principal programmé en visual c++ sous windows donc... par TCP/IP