本文讲述如何判断CAN总线是否存在以及是否bus-off,以vcan0进行讲解,vcan0是虚拟的CAN接口,可以把它看做一个软件CAN适配器(区别于硬件CAN适配器,如PeakCAN等),通过这个适配器可以让用户访问模拟的CAN总线,不用设置bitrate。
一 创建vcan0
这个在之前的系列文章中已经讲过,这里再写一遍,使用sudo权限执行下列命令即可,
$ sudo modprobe vcan
$ sudo ip link add dev vcan0 type vcan
$ sudo ip link set up vcan0
创建好之后,使用"ip addr | grep can"来进行查看,
二 检查是否存在
使用以下代码来检查,
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <errno.h>
#include <stdio.h>
int main()
{
struct ifreq ifr;
int s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "vcan1", strlen("vcan1"));
int ret = ioctl(s, SIOCGIFINDEX, &ifr);
if (ret != 0)
{
printf("=> %s\n", strerror(errno));
}
return 0;
}
代码中使用ioctl来设置vcan1的接口索引,如果vcan1不存在,那么ioctl的返回值就不是0,最后打印如下,
SIOCGIFINDEX解析:SIO是Socket IO,CG是Configure,IF是Interface,INDEX就是index,整体联合起来就是Socket IO Configure Interface Index
三 检查是否bus-off
这里以vcan0举例,创建好vcan0后,其状态是ON的,这里使用下面命令把vcan0设置为OFF状态,
sudo ip link set vcan0 down
此时vcan0就是OFF了,
然后使用下面代码进行检查,
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <errno.h>
#include <stdio.h>
int main()
{
struct ifreq ifr;
int s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "vcan0");
int ret = ioctl(s, SIOCGIFINDEX, &ifr);
if (ret != 0)
{
printf("=> %s\n", strerror(errno));
return ret;
}
ret = ioctl(s, SIOCGIFFLAGS, &ifr);
if (ret == 0)
{
if ((ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) == 0)
{
printf("=> bus off\n");
}
}
else
{
printf("==> XX %s\n", strerror(errno));
}
return ret;
}
最后打印如下,
注意代码里先获取vcan0的接口索引,这个值存放在ifr里,然后第二个ioctl会使用这个接口索引来获取vcan0的flags,所以不能把ifr清空
最后,如果想把vcan0设置为ON的状态,使用下面命令进行操作,
sudo ip link set vcan0 up
四 小结
本文是使用vcan0进行检查,如果是实际硬件设备,那么操作也是类型,只要用了socketCAN就可以,如在嵌入式Linux上操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)