mastergay
Messages postés4Date d'inscriptionvendredi 1 décembre 2000StatutMembreDernière intervention12 mars 2008
-
5 mars 2008 à 14:40
franciscohdz
Messages postés2Date d'inscriptionvendredi 4 novembre 2011StatutMembreDernière intervention 8 novembre 2011
-
8 nov. 2011 à 15:16
Bonjour, je m'apelle julien et je suis en BTS IRIS 2eme année. Pour mon projet, j'ai besoin d'établir une liaison entre une station meteo ( de type oregon scientifique ) et un DK50 ( microcontroleur de marque BECK ).
Ma question est simple : Pourquoi je ne reçois rien ??
- La station emmet en continue les infos ( vérifier avec Borland C++ Builder, j'y arrive avec les ansistring )
- J'utilise le language C .
- Le passage par HyperTerminal est obligé pour débuguer
Normalement, je devrais avoir au moin 1 octet transmit !! ( CF capture d'écran a la fin )
et le buffer d'entrée devrais contenir des infos..
Je vous join mon source ainsi que quelques infos pour comprendre le fonctionnement.
// init flow control
if (flow)
{
printf("\r-Flow control utilise:%s-\r\n", (flow==1) ? "RTS/CTS" : "XON/XOFF");
sleep(1);
if (flow == 0) // Ancun ( Pas de control de flux )
fossil_set_flowcontrol( port, FOSSIL_FLOWCTRL_OFF ); // ici 0x0
// purge des buffers entrée et sortie
fossil_purge_output( port );
fossil_purge_input( port );
retStatu1 = fossil_status_request ( port );
printf("Etat du buffer : "); if (retStatu1 96 || retStatu1 64)
{
printf("\r Le buffer a ete vide \r\n") ;
}
else
{
printf("\r Probleme, le buffer devrait etre vide\n");
}
// réception des trames dans le buffer rs232 */*/*/*/*/*/*/*/*/*/*/
Vraiment , je pense avoir tout dit, mais je suis sur qu'il manque des infos, je passe souvent ici, si quelqu'un peut m'aider je lui paye un coup a boire Merci d'avance et bonne journée a vous ! :)
Ju
cs_siskozed
Messages postés11Date d'inscriptionjeudi 25 janvier 2007StatutMembreDernière intervention20 mars 2009 6 mars 2008 à 11:05
salut, je suis aussi éleve en iris 2 et j'ai le même projet que toi. Je n'ai pas encore de réponse à ta question, je plache dessus en ce moment mais tu peux déjà me contacter sur mon mail. Je te tiens au courant de mes avancées.
cs_siskozed
Messages postés11Date d'inscriptionjeudi 25 janvier 2007StatutMembreDernière intervention20 mars 2009 7 mars 2008 à 08:56
salut,
J'ai une question, dans ton programme, tu parametre la vitesse de transfert à 9600; or apres tu te connecte en 19200. Sais-tu pourquoi ?
Sinon connais tu la structure de la trame envoyée par la station météo, je n'ai pas encore réussi à la visualiser ? J'ai essayé avec 3 hyperterminaux différents qui affichent en héxa mais sans succès.
mastergay
Messages postés4Date d'inscriptionvendredi 1 décembre 2000StatutMembreDernière intervention12 mars 2008 11 mars 2008 à 10:27
Sinon jai un doc papier avec la structure de la trame que j'avais recup en premiere année , c'est pas simple du tout, mais avant de décoder , il faudrais arriver a recevoir quelque chose et le stocker dans un tableau!
cs_siskozed
Messages postés11Date d'inscriptionjeudi 25 janvier 2007StatutMembreDernière intervention20 mars 2009 12 mars 2008 à 09:19
j'ai réussi à récupérer la trame de la station et je l'ai traduit en héxa grace a un editeur hexa. Je suis maintenant en train de l'étudier et je fais un programme c++ pour recevoir les trames et les analyser. J'ajouterais une fonction ensuite pour les décapsuler et les enregistrer dans un tableau.
cs_siskozed
Messages postés11Date d'inscriptionjeudi 25 janvier 2007StatutMembreDernière intervention20 mars 2009 8 avril 2008 à 11:14
Salut, j'ai réussi à récupérer et analyser les trames qui arrivent. Voici le code. Pour des explications plus poussées, 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
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
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);
/////////////////////// 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);
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);
//*****************************************************************************/
// 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...)
Profitez, ca marche !
Maintenant, je me concentre sur la communication avec le programme principal. Je vais utiliser les sockets.
SISKOZED
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 vide
{
printf( "\rLe buffer est vide\n") ;
}
else
{
printf( "\rProbleme, le buffer devrait etre vide\n");
}
}
void huge creerSocket(void)
{
/*1 Initialisation de la socket locale d'écoute */
/*2 Création de la socket locale d'écoute */
/*3 Attachement des paramètres de la socket locale d'écoute */
/*4 Mise en écoute de la socket locale d'écoute */
/*5 Acceptation et mise en attente de connexion d'un client */
/*6 Réception du message de l'application cliente */
/*7 Envoi d'un message à l'application cliente */
/*8 Fermeture des sockets d'écoute et de communication */
//1
parametreListenSocket.sin_family = AF_INET;
parametreListenSocket.sin_port = htons(PORT);
parametreListenSocket.sin_addr.s_addr = 0;
//2
// Création de la socket
ListenServerSocket = opensocket(SOCK_STREAM, &Erreur);
//3
Retval = bind(ListenServerSocket, (const struct sockaddr far *)¶metreListenSocket , &Erreur);
//4
//mise en écoute de la socket d'ecoute
Retval = listen(ListenServerSocket, 1, &Erreur);
// Envoie de la trame à n'importe quelle connection
while(1)
{
if((CommServerSocket = accept(ListenServerSocket, (struct sockaddr *)¶metreCommSocket, &Erreur)) != 0)
{
printf("RETVAL ::::: %f ::::::",trame);
send(CommServerSocket, &trame, 50, MSG_BLOCKING, &Erreur);
}
}
}
void huge timeout(void)
{
timer =0;
printf("Chronometre :");
do
{
RTX_Sleep_Time(1000);
timer++;
printf("%i, ",timer);
}while((timer!=30) && (flag!=1));
if(flag=1)
{
printf("\nMerci de verifier que la station est bien sous tension et qu'elle est connectee a la carte par un cable croise NULL MODEM ");
}
}
void analyserTrame()
{
// reception et analyse de la trame-----------------------------------------
do
{
flag = 0;
RTX_Create_Task(&timeoutId, &timeoutDefBlock);
i = 0;
dummy = fossil_getbyte_wait ( 0 ); // le getbyte_wait récupere les octets
//envoyés par liaison RS232
flag = 1;
RTX_Delete_Task(timeoutId);
meteobuffer[i] = dummy;
if(meteobuffer[0]==0xff) // ON TESTE SI ON A RECU L'EN-TETE FF 1 FOIS
{
printf( "\n<%x>",meteobuffer[i]) ; // On affiche le premier octet recu
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
printf( "<%x>",meteobuffer[i]) ; // On affiche le deuxieme 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( "<%x>",meteobuffer[i]) ; // On affiche le 3eme octet recu
switch (meteobuffer[2]) // en fonction de meteobuffer[2]
{
/////////////////////// VENT ///////////////////////////
case 0:
// on en deduit que 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( "<%x>",meteobuffer[i]) ; // On affiche l'octet recu
}while (i < j);
//printf( "\n Grandeur mesuree : "<< grandeur << "\n\n";
printf( "\nC'est le vent\n");
//////////////////////// Rafales et vitesse moyenne ////////
capteur_station.vrafvent = (meteobuffer[5]&0xf0)>>4;
capteur_station.vrafvent2 = (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
// boucle pour récupérer les mesures de la pluie
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
//conversion en hexadecimal
printf( "<%x>",meteobuffer[i]) ; // On affiche l'octet recu
}while (i < j);
printf( "\nC'est la pluie\n");
//////////////////////// pluviometrie en mm/h ///////////////
capteur_station.pluv = (meteobuffer[4]&0x0f)+((meteobuffer[4]&0xf0)>>4)*10+(meteobuffer[5]&0x0f)*100;
/////////////////////// THERMO, HYGRO ///////////////////////
case 3:
j =8;
// on en deduit que c'est la temperature et l'hygrometrie
// boucle pour récupérer les mesures
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
//conversion en hexadecimal
printf( "<%x>",meteobuffer[i]) ; // On affiche l'octet recu
}while (i < j);
case 6:
j =13;
// on en deduit qu'on ne traite pas cette grandeur
// boucle pour récupérer les mesures
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
}while (i < j);
printf( "\nOn ne traite pas cette grandeur\n");
break;
case 14:
j =4;
// on en deduit qu'on ne traite pas cette grandeur
// boucle pour récupérer les mesures
do
{
i++;
dummy = fossil_getbyte_wait ( 0 );
meteobuffer[i] = dummy;
}while (i < j);
printf( "\nOn ne traite pas cette grandeur\n");
break;
default:
// on en deduit que c'est une grandeur que l'on ne traite pas
printf( "\nOn ne traite pas cette grandeur\n");
break;
}; // fin switch case
}
else
{
printf("\nDesynchronisation de la trame a partir du deuxieme octet. La station meteo se synchronise. Si le processus dure plus d'une minute, merci de redemarrer la station meteo.\n");
}// fin else (if recup2 != ff)
}
else
{
printf("\nDesynchronisation de la trame des le 1er octet. La station meteo se synchronise. Si le processus dure plus d'une minute, merci de redemarrer la station meteo.\n");
} // fin else (if recup != ff)
/******************************************************************************
* Constants
******************************************************************************/
#define TASKSTACKSIZE 2048 // Size of stack for created tasks in bytes
#define PORT 4000
/******************************************************************************
* Global variables
******************************************************************************/
/*/////////////////////////////////////////////////////////////////////////////
variables pour la fonction d'analyse de la trame
/////////////////////////////////////////////////////////////////////////////*/
int retStatu1;
int i;
int j;
int a;
// structure de stockage des mesures
struct capteur_station_tag
{
int vmoyvent; // vitesse des rafales du vent
int vrafvent; // vitesse moyenne du vent
int vrafvent2; // rafales du vent 0.1 digit
int dvent; // direction du vent exprimee en °C
int temp; // temperature
int temp2; // temperature 0.1 digit
int signe; // signe temperature
int hygr; // hygrometrie
int pluv; // pluviometrie
}capteur_station;
/*/////////////////////////////////////////////////////////////////////////////
variables pour le thread de vérification de communication avec la station météo
/////////////////////////////////////////////////////////////////////////////*/
int timeoutId; // ID du thread timeout qui verifie la reception de messages dans un delai acceptable
int timer;
int flag;
unsigned int timeoutStack[TASKSTACKSIZE/sizeof(unsigned int)];
// pile
TaskDefBlock timeoutDefBlock = {
timeout, // Function to be executed in the task
{'T','I','M','E'}, // Nom de la tache
&timeoutStack[TASKSTACKSIZE/sizeof(unsigned int)],
// Top of stack
TASKSTACKSIZE, // Size of the stack
0, // Not supported
26, // Normal priority
0, // Time slice (not needed here)
0, 0, 0, 0 // Mailbox depth (not needed here)
}; // Information on task 1
/*/////////////////////////////////////////////////////////////////////////////
variables pour le thread de création de la communication socket
/////////////////////////////////////////////////////////////////////////////*/
int creerSocketId; // ID du thread de creation de la communication par socket
unsigned int creerSocketStack[TASKSTACKSIZE/sizeof(unsigned int)];
// pile
TaskDefBlock creerSocketDefBlock = {
creerSocket, // fonction qui va etre lancee par le thread
{'S','O','C','K'}, // Nom de la tache
&creerSocketStack[TASKSTACKSIZE/sizeof(unsigned int)],
// Top of stack
TASKSTACKSIZE, // Size of the stack
0, // Not supported
26, // Normal priority
0, // Time slice (not needed here)
0, 0, 0, 0 // Mailbox depth (not needed here)
}; // Information on task 1
/*/////////////////////////////////////////////////////////////////////////////
variables pour la communication par socket
/////////////////////////////////////////////////////////////////////////////*/
// descripteurs de sockets (ecoute et comm)
int ListenServerSocket;
int CommServerSocket;
// variable de traitement
int Erreur;
int Retval;
char trame[9][1000];; // represente la trame que l'on va envoyer au client
char* tramebuffer;
// Enregistrements des parametres des sockets
struct sockaddr_in parametreListenSocket;
struct sockaddr_in parametreCommSocket;
cs_siskozed
Messages postés11Date d'inscriptionjeudi 25 janvier 2007StatutMembreDernière intervention20 mars 2009 20 mars 2009 à 13:59
Bonjour,
mon projet a l'air de concerner pas mal de personnes vu le nombre de mails que je recois, je partage donc mes fichiers avec quiconque le veut.
Voici mes dossiers de conception préliminaire et détaillé, de réalisation et d'intégration.
bon courage à tous
SISKOZED
franciscohdz
Messages postés2Date d'inscriptionvendredi 4 novembre 2011StatutMembreDernière intervention 8 novembre 2011 8 nov. 2011 à 15:16
bonjour je suis un étudiant a l'iut de saint-dié-des vosges je prépare ma licence professionnelle, et j'aurai besoin pour mon projet un programme sous borland C++ qui peut décoder la trame NMEA délivrer par un récepteur GPS fastrax up501, pour l'executer sur une carte DK50 (beck). Merci à vous d'avance
Amicalement, Francisco