2016-04-21 1 views
2

J'essaie de faire une lecture de socket à partir du socket CAN. Mon appel en lecture est bloqué et ne renvoie jamais le contrôle à l'extérieur.SocketCAN appel de socket de lecture bloque

étapes dans mon flux de code:

  1. ouvrir une socket
  2. assign nom de l'interface
  3. assign ID CAN
  4. Assign peut masquer
  5. bind
  6. lecture/réception appel à la prise

Voici le code:

mSock = socket(PF_CAN,SOCK_RAW,CAN_RAW); 
if(mSock < 0) { 
    std::cout << "failed to open socket\n" << std::endl; 
} 
else { 
    std::cout << "mSock = \n" << mSock << std::endl; 
} 
strcpy(ifr.ifr_name,"can0"); 
iotlRetVal = ioctl(mSock,SIOCGIFINDEX, &ifr); 

if(iotlRetVal < 0) { 
    std::cout << "failed to open socket\n" << std::endl; 
} 
else { 
    std::cout << "ifr.ifr_ifindex = \n" << ifr.ifr_ifindex << std::endl; 
} 

cfilter.can_id = 0xabcdef0; 
cfilter.can_mask = CAN_EFF_MASK; 

addr.can_family = AF_CAN; 
addr.can_ifindex = ifr.ifr_ifindex; 

bindRetVal = bind(mSock, (struct sockaddr *) &addr, sizeof(addr)); 
if(bindRetVal < 0) { 
    std::cout << "failed to bind socket\n" << std::endl; 
} 
else { 
    std::cout << "bindRetVal = \n" << bindRetVal << std::endl; 
} 
char buff[200]; 
int len; 
int test; 

test = recvfrom(mSock, &buff, sizeof(buff), 0, 
     (struct sockaddr *) &addr, (socklen_t *)&len); 
printf("test:%d \t len:%d\n",test,len); 

Ce que je suis observais est que cet appel ne revient pas du tout, et il est tout simplement être bloqué.

Si je fais ifconfig dans mon PC Linux, je vois les suivantes:

can0  Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
      UP RUNNING NOARP MTU:16 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:10 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 
      Interrupt:83 

est-elle liée aux 00s du Hwaddr: 00-00-00 ..... Est-ce arriver quand il y a un problème sur mon matériel d'interface Can?

Ou s'il s'agit d'un problème logiciel, dans quel scénario mon appel en lecture serait-il bloqué?

Répondre

1

C'est le comportement normal qui se produit lorsqu'il n'y a pas de message dans le tampon. Dès qu'il y a un message dans le bus, il reviendra avec le contenu du message.
Si vous ne voulez pas attendre, utilisez le drapeau O_NONBLOCK.

Pour paramètre global d'utilisation fcntl(mSock, F_SETFL, O_NONBLOCK) sur la description de fichier ouvert.

Si vous avez l'intention de l'utiliser uniquement par appel avec l'optionrecvfrom(...), puis utilisez MSG_DONTWAIT d'autre part.

+0

une idée sur l'autre requête que j'avais sur l'adresse HW venant sous la forme d'une chaîne de 00s? – Sushant

+0

J'ai le même HWaddr dans mon système embarqué. C'est un moyen commun de savoir comment l'interface CAN est enregistrée, alors ça va. S'il vous plaît ne pas oublier de vider ou d'accepter la réponse si vous pensez que cela vous a aidé. Merci. – marc