在调试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返回的错误帧,可以更加详细知道错误的原因。