CAN总线开发实例

转载 2016年08月30日 16:45:04
下面通过实例来说明CAN总线接口的使用方法。在本例中,有两个进程,其中一个进程负责报文的发送(标识符为0x11和0x22),另一个进程负责报文的接收和过滤(只接收标识符为0x11的报文)。


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
 int s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame[2] = {{0}};
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);  //创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);     //指定can0设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));   //将套接字与can0绑定
//禁用过滤规则,本进程不接收报文,只负责发送
  setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
  //生成两个报文
frame[0].can_id = 0x11;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'Y';
frame[0].can_id = 0x22;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'N';
//循环发送两个报文
while(1) {
nbytes = write(s, &frame[0], sizeof(frame[0]));  //发送frame[0]
if (nbytes != sizeof(frame[0])) {
    printf("Send Error frame[0]\n!");
    break;        //发送错误,退出
}
 sleep(1);
nbytes = write(s, &frame[1], sizeof(frame[1]));  //发送frame[1]
if (nbytes != sizeof(frame[0])) {
    printf("Send Error frame[1]\n!");
    break;
}
 sleep(1);
}
close(s);
return 0;
}


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[1];
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);  //创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);     //指定can0设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));   //将套接字与can0绑定
  //定义接收规则,只接收表示符等于0x11的报文
rfilter[0].can_id   = 0x11;
rfilter[0].can_mask = CAN_SFF_MASK;
//设置过滤规则
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
  while(1) {
   nbytes = read(s, &frame, sizeof(frame));   //接收报文
   //显示报文
if (nbytes > 0) {
printf(“ID=0x%X DLC=%d data[0]=0x%X\n”, frame.can_id,
frame.can_dlc, frame.data[0]);
}
}
close(s);
return 0;
}

CAN总线开发实例

下面通过实例来说明CAN总线接口的使用方法。在本例中,有两个进程,其中一个进程负责报文的发送(标识符为0x11和0x22),另一个进程负责报文的接收和过滤(只接收标识符为0x11的报文)。 /* 1...

CAN总线实例

  • 2016年08月30日 16:48
  • 6.1MB
  • 下载

stm32can总线实例

  • 2012年03月17日 16:27
  • 1.06MB
  • 下载

CAN总线应用开发接口

由于系统将CAN设备作为网络设备进行管理,因此在CAN总线应用开发方面,Linux提供了SocketCAN接口,使得CAN总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。 此...

ARM嵌入式开发系统与CAN总线

随着集成电路和嵌入式电脑在汽车上的广泛应用,现代汽车上的电子控制器的数量越来越多,常见的有发动机的电子燃油喷射装置、防抱死制动装置(ABS)、安全气囊装置、电动门窗装置、主动悬架等。电控系统的增加虽然...
  • cometwo
  • cometwo
  • 2012年12月09日 12:27
  • 1037

stm32多块开发板can总线互联卡死问题

多块can总线开发板互联时,要么编写can接收中断的服务程序,要么不要使能接收中断,即不使能FIFO0消息挂号中断,否则要加入类似如下的中断服务程序 /* USB中断和CAN接收中断服务程序,USB跟...

完整Android CAN总线程序开发

最近在研究一块TI公司的TMDEVM-AM3358开发板,这是一款硬件资源相当丰富并且性能非常好的工业评估板,我重点需要用到板上的网卡、串口以及CAN总线。众所周知,在android这样一款风靡全球的...
  • MC_hust
  • MC_hust
  • 2015年03月22日 21:30
  • 1745

AT91 linux开发板的驱动\CAN总线驱动

编写心得;can总线的芯片是mcp2515,利用spi进行数据的读写,spi是写在底层的驱动,对于mcp的数据读写操作放在应用层里面完成的1:spi的底层驱动代码是#include #include ...

CAN总线开发

  • 2014年04月08日 17:54
  • 20.27MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CAN总线开发实例
举报原因:
原因补充:

(最多只允许输入30个字)