Je travaille actuellement sur un linux embarqué et j'aimerai faire fonctionner l'IRDA. Pour cela je dispose d'un dongle usb irda (sigmatel) et d'un appareil ayant un port infrarouge.
J'ai mis dans le noyau linux par défaut les drivers IrCoMM et sigmatel pour l'IRDA.
Lorsque je mets la clé irda, j'ai :
usb 1-1: new full speed USB device using at91rm9200-ohci and address 7
SigmaTel STIr4200 IRDA/USB found at address 7, Vendor: 66f, Product: 4200
drivers/net/irda/stir4200.c: IrDA: Registered SigmaTel device irda0
j'attache la clé irda:
irattach irda0 -s
j'ai un programme qui ouvre une socket irda, qui identifie le materiel irda mais lorsque j'envoie des données à l'appareil, j'ai rien en retour. Pour le code source voir ci dessous.
2 questions:
Est ce que l'irattach fonctionne comme celà?
y at'il une erreur dans le code? je fais pas de setsockopt pour l'initialisation du protocole IRDA: faut il en faire?
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include signal.h
#include fcntl.h
#include errno.h
#include sys/types.h
#include sys/stat.h
#include sys/socket.h
#include sys/un.h
#include linux/types.h
#include linux/irda.h
#include linux/ircomm_param.h
#ifndef AF_IRDA /*socket.h*/
#define AF_IRDA 23
#endif
#define IAS_SET_ATTRIB_MAX_LEN 22;
#define MAX_DEVICES 10
#define DISC_BUF_LEN sizeof(struct irda_device_list)+ sizeof(struct irda_device_info) * ( MAX_DEVICES)
#define IRLMP_9WIRE_MODE 0x04
struct irda_device_list *list;
unsigned char buf[DISC_BUF_LEN];
int search_devices(int fd)
{
int len;
int i;
int daddr = 0;
int erreur_getsockopt;
int connfd;
int self;
int pid;
list = (struct irda_device_list *) buf;
len = DISC_BUF_LEN;
if ( erreur_getsockopt = getsockopt(fd, SOL_IRLMP, IRLMP_ENUMDEVICES,(char * )list,&len)) {perror("Aucun service trouvé"); exit(-1);}
if (len 0) {
printf("Discovered:\n");
for (i=0;ilist-len;i++) {
printf(" daddr: %08x", list-dev[i].daddr);
printf(" saddr: %08x", list-dev[i].saddr);
printf(" name: %s\n", list-dev[i].info);
daddr = list-dev[i].daddr;
}
}
else
{
printf("No devices discovered.\n");
}
return daddr;
}
int sendfile() {
int fd;
struct sockaddr_irda peer;
struct ircomm_tty_cb *self;
struct ircomm_params param_irda;
int daddr;
FILE* f;
unsigned char buf[4096];
unsigned char sendchar[512]="GHEVS\n";
int rc;
int error;
int buflen;
char * test_car;
struct irda_ias_set ias_set;
int len;
int length_buffer = 512;
fd = socket(AF_IRDA, SOCK_STREAM, 0);
if (fd 0) {
perror("socket");
if (errno == EINVAL)
fprintf(stderr, "Impossible d'ouvrir une socket\n");
exit(-1);
}
char b;
scanf("%c",&b);
daddr = search_devices(fd);
printf(" daddr en dehors: %08x\n", daddr);
if (!daddr) {
fprintf(stderr,"device IRDA (-- ZOLL) not found\n");
exit(1);
}
strcpy(ias_set.irda_class_name, "IrDA:IrCOMM");
strcpy(ias_set.irda_attrib_name, "IrDA:TinyTP:LsapSel");
ias_set.irda_attrib_type = IAS_STRING;
ias_set.attribute.irda_attrib_string.len = 20;
peer.sir_addr = daddr;
peer.sir_family = AF_IRDA;
strcpy(peer.sir_name, "IrDA:IrCOMM");
printf("******************************\n");
printf("FAMILLE: %d\n",peer.sir_family);
printf("LSAP: %d\n",peer.sir_lsap_sel);
printf("ADDR: %08x\n",peer.sir_addr);
printf("NAME: %s\n",peer.sir_name);
printf("******************************\n");
if (connect(fd, (struct sockaddr *) &
peer, sizeof(struct sockaddr_irda)))
{
perror("connect");
if (errno == ENETUNREACH){
fprintf(stderr, "impossible d'établir une connexion\n");
exit(-1);
}
}
char a;
scanf("%c",&a);
printf ("send\n");
error = send(fd,sendchar, 6, 0);
if (error == -1){
printf("error_send\n");
}
else
{
printf("ok: %d %s\n", error,(const char *)sendchar);
}
printf ("recv\n");
recv( fd, buf,4096, 0 ); //4096
printf("---buffer:%s---\n", buf);
close(fd);
}
int main(){
sendfile();
return 0;
}
Merci par avance
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.