CAN bus的移植 虚拟VCAN

CAN bus的移植
一、首先要阅读相关的文档了解can bus协议;
二、驱动移植,内核中一般是自带相关的can驱动,如果没有可以自行加入;
三、测试,首先下载can bus套件:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$git clone https://git.gitorious.org/linux-can/can-utils.git  
  2. fulinux ~$cd can-utils  
  3. fulinux ~$ls**** candump.c ***  
[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$make  


make后有candump执行程序。如果没有can设备,可以通过下面的linux命令来创建一个虚拟的can设备:


[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$ modprobe can  
  2. fulinux ~$ modprobe can_raw  
  3. fulinux ~$ modprobe vcan  
  4. fulinux ~$ sudo ip link add dev vcan0 type vcan  
  5. fulinux ~$ sudo ip link set up vcan0  
  6. fulinux ~$ ip link show vcan0  
  7. 3: vcan0: <NOARP,UP,LOWER_UP> mtu 16 qdisc noqueue state UNKNOWN  
  8. link/can  


在编写一个小程序candump-client,配合candump程序一同测试:


[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <string.h>  
  5. #include <net/if.h>  
  6. #include <sys/types.h>  
  7. #include <sys/socket.h>  
  8. #include <sys/ioctl.h>  
  9. #include <linux/can.h>  
  10. #include <linux/can/raw.h>  
  11. int  
  12. main(void)  
  13. {  
  14. int s;  
  15. int nbytes;  
  16. struct sockaddr_can addr;  
  17. struct can_frame frame;  
  18. struct ifreq ifr;  
  19. charchar *ifname = "vcan0";  
  20. if((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {  
  21. perror("Error while opening socket");  
  22. return -1;  
  23. }  
  24. strcpy(ifr.ifr_name, ifname);  
  25. ioctl(s, SIOCGIFINDEX, &ifr);  
  26. addr.can_family = AF_CAN;  
  27. addr.can_ifindex = ifr.ifr_ifindex;  
  28. printf("%s at index %d\n", ifname, ifr.ifr_ifindex);  
  29. if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {  
  30. perror("Error in socket bind");  
  31. return -2;  
  32. }  
  33. frame.can_id = 0x123;  
  34. frame.can_dlc = 2;  
  35. frame.data[0] = 0x11;  
  36. frame.data[1] = 0x22;  
  37. nbytes = write(s, &frame, sizeof(struct can_frame));  
  38. printf("Wrote %d bytes\n", nbytes);  
  39. return 0;  
  40. }  


同时修改makefile文件,将candump-client程序加入到makefile文件中一起编译:


[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. PROGRAMS = can-calc-bit-timing candump candump-client cansniffer cansend canplayer cangen canbusload\  
  2. candump.o: lib.h  
  3. candump-client.o: lib.h  
  4. candump: candump.o lib.o  
  5. candump-client: candump-client.o lib.o  

编译:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$make  


在两个终端上执行:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$./candump vcan0  
  2. fulinux ~$./candump-client  


执行结果:


也可以直接结婚can-utils目录下的candump和cansend程序一同测试:

发送端:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./cansend vcan0 5A1#11.2233.44556677.88  
  2. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  3. [fulinux@ubuntu can-utils]$ ./cansend vcan0 5AA#  
  4. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123##1  
  5. CAN interface ist not CAN FD capable - sorry.  
  6. [fulinux@ubuntu can-utils]$ ./cansend vcan0 1F334455#1122334455667788  
  7. [fulinux@ubuntu can-utils]$ ./cansend vcan0 1F334455#112233445566778899  
  8. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#R  


接收端:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./candump vcan0  
  2. vcan0 5A1 [8] 11 22 33 44 55 66 77 88  
  3. vcan0 123 [4] DE AD BE EF  
  4. vcan0 5AA [0]  
  5. vcan0 1F334455 [8] 11 22 33 44 55 66 77 88  
  6. vcan0 1F334455 [8] 11 22 33 44 55 66 77 88  
  7. vcan0 123 [0] remote request  


第一个小游戏:

第一个终端中:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$./candump -b vcan0 vcan0,123:C00007FF  

第二个终端中:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  


你会看到第一个终端中不停地打印如下数据:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. vcan0 123 [4] DE AD BE EF  
  2. vcan0 123 [4] DE AD BE EF  
  3. vcan0 123 [4] DE AD BE EF  

因为vcan0这时候充当了一个网关的角色,将vcan0接收到的数据在转发给vcan0,于是就形成了一个循环。


第二个小游戏:

创建一个vcan1设备:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux ~$ sudo ip link add dev vcan1 type vcan  
  2. fulinux ~$ sudo ip link set up vcan1  
  3. fulinux ~$ ip link show vcan1  
  4. 3: vcan1: <NOARP,UP,LOWER_UP> mtu 16 qdisc noqueue state UNKNOWN  
  5. link/can  

第一个终端中:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$./candump -b vcan1 vcan0,123:C00007FF  

第二个终端中:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$./candump -b vcan0 vcan1,123:C00007FF  

第三个终端中:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  

于是你就会看的第一二两个终端上不停的打印信息,原因是,vcan0接收到的数据转发给vcan1,vcan1接收到的数据再转发给vcan0,于是就形成了一个循环。


第三个小游戏:

第一个终端接收:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. fulinux@ubuntu can-utils]$ ./candump -c -ta vcan0,123:7FF,400:700,#000000FF vcan1,400~7F0  
  2. (1406170861.311895) vcan0 123 [4] DE AD BE EF  
  3. (1406170896.189825) vcan0 123 [0] remote request  
  4. (1406170917.890993) vcan1 123 [0] remote request  
  5. (1406170960.689413) vcan0 400 [0] remote request  
  6. (1406170999.256695) vcan1 111 [0] remote request  


第二个终端发送:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  2. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  3. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  4. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  5. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  6. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#DEADBEEF  
  7. [fulinux@ubuntu can-utils]$ ./cansend vcan0 123#R  
  8. [fulinux@ubuntu can-utils]$ ./cansend vcan1 123#R  
  9. [fulinux@ubuntu can-utils]$ ./cansend vcan0 400#R  
  10. [fulinux@ubuntu can-utils]$ ./cansend vcan0 111#R  
  11. [fulinux@ubuntu can-utils]$ ./cansend vcan1 111#R  
  12. [fulinux@ubuntu can-utils]$ ./cansend vcan1 400#R  

第四个小游戏:

延迟转发:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. [fulinux@ubuntu can-utils]$ ./candump -u 3000000 -b vcan0 vcan0,123:C00007FF   
  2.   vcan0  123   [5]  DE AD BE EF 33  
  3.   vcan0  123   [5]  DE AD BE EF 33  
  4.   vcan0  123   [5]  DE AD BE EF 33  
  5.   vcan0  123   [5]  DE AD BE EF 33  


by fulinux

email:fulinux@sina.com
blog: blog.csdn.net/fulinus

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值