Articles Taggés ‘La Communication’

4- Radio Communication Xbee

15 septembre 2010

Post to Twitter

A) Introduction

La liaison radio permet de communiquer avec mon bateau depuis une station ( Ordinateur portable, Téléphone Anrdoid,…). Cette liaison me permet de suivre les états du système ( Coordonnées GPS, Inclinaison du bateau, Énergie restantes des batteries,…) mais aussi pour pouvoir donner des instructions.

B) L’implémentation

Les liaisons radios des modules Xbee Pro permettent de communiquer via seulement un seul lien physique le port série. Le port série un est fichier spécial « /dev/ttySX » sur lequel les processus léger décrits en dessous utilisent les primitives read et write pour communiquer.

Pour mon projet, j’ai besoin de pouvoir envoyer et recevoir des données de plusieurs processus en même temps. C’est pourquoi, j’ai besoin de (de)multiplexer des connexions virtuelles entre la station et les différents processus du bateaux.

Voici le protocole que j’ai utilisés, sur le port série je sérialise un message qui contient la structure suivante :

struct {
unsigned char id_fifo
unsigned char nb_byte;
char data[XBEE_SIZE_MSG];
} XbeeMsg;

Sur la station et sur le bateau, deux processus léger sont en charges de la réception des données (RX: démultiplexage) et d’envoyer les messages (TX:multiplexage).

Multiplexage : Le multiplexage consiste grâce à la primitive select qui attend des changements d’état sur l’ensemble des descripteurs des FIFOs définit dans l’ensemble grâce à la primitive FD_SET(int fd, fd_set *set); . Si un changement d’état est détecté via FD_ISSET, la tâche du processus léger multiplexage consiste a écrire sur le port série.

Démultiplexage : Le démultiplexage consiste à lire sur le port série puis à de de-sérialiser la structure. Ensuite, il faut regarder le Byte id_fifo qui permet d’indiquer dans qu’elle FIFO il faut écrire. Ci-dessous un schéma récapitulatif :

C) Schéma de l’architecture

D) Extrait du code source :

void *xbee_demultiplexer()
{

int n,i,size;
XbeeMsg *msgbuf;
static XbeeMsg msg;

unsigned char buffer[sizeof(msg)]

MYLOGMSG(LOG4C_PRIORITY_DEBUG, "Starting of Demultiplexer");

FOREACHTUBE( i ){
if (( xbee.fd_in [ i ] = open ( xbee.nomtube_in [ i ] , O_RDWR | O_NONBLOCK )) == -1)
{
mylog_log(MYLOG_CATEGORY_NAME,LOG4C_PRIORITY_ERROR,"Demultiplexer failure of openning fifo %s ",xbee.nomtube_in[ i ] );
/* TODO */
exit(ERROR_MKFIFO_OPEN);
}

while(1)
{

if(read_xbee((char*)xbee_msg) != OK)
{
mylog_log(MYLOG_CATEGORY_NAME,LOG4C_PRIORITY_ERROR,"Failure demultiplexer read xbee");

}
else{

if(sscanf((char*)xbee_msg,"$ %s\r\n",buffer) == 1)
{

msgbuf = (XbeeMsg *)&buffer;
msg = *msgbuf;

/* ouverture du tube nommée */
n=open(xbee.nomtube_in[msg.id-1],O_WRONLY);
if(n < 0)
{
mylog_log(MYLOG_CATEGORY_NAME,LOG4C_PRIORITY_ERROR,"demultiplexer failure of openning fifo %s ",xbee.nomtube_in[ i ] );

}else
{
size = write(n ,&msg , sizeof(msg));
if(size != (int)sizeof(msg))
{
mylog_log(MYLOG_CATEGORY_NAME,LOG4C_PRIORITY_ERROR,"demultiplexer message corrupted");

}else
{

/* on libère un jeton pour read_fifo */
V_XBEE(msg.id-1);

}

}
close(n);
mylog_log(MYLOG_CATEGORY_NAME,LOG4C_PRIORITY_DEBUG,"DEMULTIPLEXER ID :%d  FIFO : %s  DATA %s ",msg.id,xbee.nomtube_in[msg.id-1]);
}else
{
/* MSG FROM LINUX SYSTEM */
if((int)strlen((char*)xbee_msg) > 2){
mylog_log("core",LOG4C_PRIORITY_DEBUG,"OS message : %s",xbee_msg);

}
}
}
usleep(100);
}
}

MYLOGMSG(LOG4C_PRIORITY_DEBUG, "Sucessfuly close DEMULTIPLEXER");
return 0;

}

Twitter links powered by Tweet This v1.8.1, a WordPress plugin for Twitter.