socket can 获取状态标志

在调试can总线时,可以通过ip -d link show 可以查看can接口信息

 

在使用socketcan进行编程时,需要知道can当前状态信息,可以通过获取系统错误码来识别一些can错误信息

extern int errno;
switch(errno)
{
    case 100:
        printf( "network is down");
        break;
    case 105:
        printf( "no buffer space available");
        break;
    case 22:
       printf( "dlc超过8");
        break;
}
/*
		105:no buffer space available
		100:network is down
		22:dlc超过8
*/

但是这种方式无法获取到canbusoff错误,所以要通过另一种方式。

int can_check(char *name)
{
    struct ifreq ifr;
    //int s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
 
    
   
	// ifr.ifr_ifindex=2;//获得第2个网络接口的名称 
	// int err=ioctl(s,SIOCGIFNAME,&ifr);
	// if(err){
	// 	perror("index error");
	// }else{
	// 	printf("the %dst interface is:%s\n",ifr.ifr_ifindex,ifr.ifr_name);
	// }

	strcpy(ifr.ifr_name, name);
	int err=ioctl(handle,SIOCGIFFLAGS,&ifr);
    if (!err)
    {
       printf("%s flags:\t%d\n",name,ifr.ifr_flags);
       if(ifr.ifr_flags == 129)
       {
       	printf("%s:bus off\n",name );
       }
    }else
    {
    	perror("index error");
    }
     /*
		ifr.ifr_flags
		129 busoff
		128 can down
		193 no buffer
    */
}

最好的方式是通过解析can返回的错误帧,可以更加详细知道错误的原因。

你可能感兴趣的:(Linux)