IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Socket CAN en mode BCM pas de réception


Sujet :

Linux

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Socket CAN en mode BCM pas de réception
    Bonjour,

    je rencontre quelques difficultés à utiliser la librairie SocketCAN. J'ai tout d'abord développé mon programme en utilisant le socket can en mode raw et tout allait bien. Mais comme j'ai décidé d'envoyer des trames CAN de façon cyclique, je me suis dit que ce serait une bonne idée de passer en mode BCM. Mais la c'est une autre affaire.

    J'arrive a créer mon socket et à écrire la configuration pour la réception de trames mais je ne lis jamais rien et ça que la lecture soit bloquante ou pas. J'ai beau vérifier mon code avec ce aue je trouve sur les divers tuto, mais rien a faire. Si je reviens en mode raw, cela fonctionne a nouveau. Ca fait 2 jours que je bataille avec ça... Voici le dernier bout de code que j'ai fait pour tester:

    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
     
    int CAN_init_can (can_t* CanStruct)
     {
    	int s, flags, iNbytes;
    	struct sockaddr_can addr;
        struct ifreq ifr;
     
     
    	//if((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
        if((s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM)) < 0)
    	{
    		perror("Error while opening socket\n");
    		return -1;
    	}
     
    	strcpy(ifr.ifr_name, CanStruct->sCanPort );
     
        if(ioctl(s, SIOCGIFINDEX, &ifr) < 0)
    	{
    		printf("ioctl error: %s\n", strerror(errno));
    		perror(strerror(errno));
    		return -1;
    	}
     
        addr.can_family = AF_CAN;
        addr.can_ifindex = ifr.ifr_ifindex;
     
        /* Set socket to non-blocking */
        flags = fcntl(s, F_GETFL, 0);
        if (flags < 0)
        {
        	perror("fcntl: F_GETFL");
            return errno;
        }
     
        if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)
        {
        	perror("fcntl: F_SETFL");
        	return errno;
        }
     
    #ifdef DEBUG
    	printf("Can ID: %s at index %d\n", CanStruct->sCanPort, ifr.ifr_ifindex);
    #endif
     
    	//if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    	if(connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    	{
    		printf("Error in socket bind");
    		return -1;
    	}
     
    	struct can_msg_BCM CanBcmFrameRx;
     
    	/*CanStruct->*/CanBcmFrameRx.msg_head.opcode 	= RX_SETUP;
    	/*CanStruct->*/CanBcmFrameRx.msg_head.can_id 	= 0x18FEF100;
    	/*CanStruct->*/CanBcmFrameRx.msg_head.flags 	= 0;
    	/*CanStruct->*/CanBcmFrameRx.msg_head.nframes 	= 0;
    	iNbytes = write(s, &/*CanStruct->*/CanBcmFrameRx, sizeof(struct can_msg_BCM));
    	if( iNbytes < 0)
    	{
    		printf("write error init: RX_SETUP");
    		//return errno;
    	}
    	iNbytes = read(s, &/*CanStruct->*/CanBcmFrameRx, sizeof(struct can_msg_BCM));
            if (iNbytes < 0)
    		printf ("read error %d", errno);
     
     
    /*	CanStruct->CanBcmFrameTx.msg_head.opcode 	= TX_SETUP;
    	CanStruct->CanBcmFrameTx.msg_head.can_id 	= 0x124;
    	CanStruct->CanBcmFrameTx.msg_head.flags 	= 0;
    	CanStruct->CanBcmFrameTx.msg_head.nframes 	= 0;
    	CanStruct->CanBcmFrameTx.canframe.can_id	 	= 0x18fef999;
    	CanStruct->CanBcmFrameTx.canframe.can_dlc		= 2;
    	CanStruct->CanBcmFrameTx.canframe.data[0]		= 0xFF;
    	CanStruct->CanBcmFrameTx.canframe.data[1]		= 0xFF;
     
    	if( write(s, &CanStruct->CanBcmFrameTx, sizeof(struct can_msg_BCM)) < 0)
    	{
    		printf("write error init: TX_SETUP %d", errno);
    		//return errno;
    	}
    	iNbytes = read(s, &CanStruct->CanBcmFrameTx, sizeof(struct can_msg_BCM));
    */
    	return s;
     }
    Le code erreur de la lecture est 11 ce qui correspond à:
    EAGAIN: The file descriptor fd refers to a file other than a socket and has been marked nonblocking (O_NONBLOCK), and the read would block.

    Dernier detail, je developpe dans une VM, sous linux Ubuntu avec Eclipse (on sais jamais si l'info peur etre utile...)

    Merci d'avance pour votre aide.

  2. #2
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Un petit up!! Personne ne saurait m'aider svp?

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    à voir mais il est possible que la discussion aurait eu une visibilité plus appropriée dans le forum C,C++ / Bibliothèques

    ensuite tu utilises une lib assez spécifique et pas forcément très répandue, ça fait d'autant moins de monde susceptible de tester ton code et de t'aider

    enfin la description du problème n'est pas forcément très explicite non plus; donc si je comprends bien sur les 90 lignes de code que tu colles y'a un problème quelque part, on ne sait ni vraiment si ça compile, s'il y a un message d'erreur, de quel type etc. autant d'informations qui rendent le problème moins indigeste au premier abord et donnent un peu plus envie de s'y intéresser, je présume.

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    à voir mais il est possible que la discussion aurait eu une visibilité plus appropriée dans le forum C,C++ / Bibliothèques

    ensuite tu utilises une lib assez spécifique et pas forcément très répandue, ça fait d'autant moins de monde susceptible de tester ton code et de t'aider

    enfin la description du problème n'est pas forcément très explicite non plus; donc si je comprends bien sur les 90 lignes de code que tu colles y'a un problème quelque part, on ne sait ni vraiment si ça compile, s'il y a un message d'erreur, de quel type etc. autant d'informations qui rendent le problème moins indigeste au premier abord et donnent un peu plus envie de s'y intéresser, je présume.
    Bonjour,

    Merci pour les infos, je vais le modifier pour ajouter plus de détails. Je vais regarder aussi si je peux le déplacer. Je me doute que c'est spécial comme bibliothèque...
    Pour info, le code compile bien, je n'ai pas de Warnings ou d'erreurs à la compil. Pour l'erreur que j'ai je pensais avoir été précis mais je vais regarder comment préciser plus cela.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/11/2006, 02h00
  2. Config postfix - pas de réception de mail
    Par webrider dans le forum Réseau
    Réponses: 11
    Dernier message: 09/08/2006, 22h16
  3. [Socket] Les débuts c'est pas rose...
    Par if_zen dans le forum Langage
    Réponses: 6
    Dernier message: 16/05/2006, 00h22
  4. [Upload] Upload fichier,Pas de réception
    Par vincedjs dans le forum Langage
    Réponses: 11
    Dernier message: 03/02/2006, 15h27
  5. [socket RAW] sendto ne marche pas !
    Par poporiding dans le forum C++
    Réponses: 4
    Dernier message: 18/01/2006, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo