参考cansend 的方法进行发送can 数据。

    //  我今天参考了 NXP 官网,用了旧一版的 libsocket, 但是我觉得总体上来说变话是没有的。
// 参考: https://community.nxp.com/docs/DOC-1437
// 进入 canutils-4.0.6 目录
// 在 src 目录下, 可以看到 cansend.c
vim src/cansend.c // 直接看到 main 函数
48 int main(int argc, char **argv)
49 {
// 默认的一些参数
56 int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW;
58 int s, opt, ret, i, dlc = 0, rtr = 0, extended = 0;
// ... ...
// 这里直接是获取了所有的参数并解析它
75 while ((opt = getopt_long(argc, argv, "hf:t:p:vi:lre", long_options, NULL)) != -1) {
76 switch (opt) {
77 case 'h': // 打印帮助信息
78 print_usage(basename(argv[0]));
79 exit(0);
80
81 case 'f': // 家族
82 family = strtoul(optarg, NULL, 0);
83 break;
84
85 case 't': // 类型
86 type = strtoul(optarg, NULL, 0);
87 break;
88
89 case 'p': // 协议
90 proto = strtoul(optarg, NULL, 0);
91 break;
92
93 case 'v': // 打印发送的数据
94 verbose = 1;
95 break;
96
97 case 'l': // 循环次数
98 if (optarg)
99 loopcount = strtoul(optarg, NULL, 0);
100 else // 或是是无数次
101 infinite = 1;
102 break;
103 case 'i': // 指定接口 -ican0
104 frame.can_id = strtoul(optarg, NULL, 0);
105 break;
106
107 case 'r': // 指定是否是远程帧
108 rtr = 1;
109 break;
110
111 case 'e': // 扩展帧
112 extended = 1;
113 break;
114
115 case VERSION_OPTION: // 打印版本信息
116 printf("cansend %s\n", VERSION);
117 exit(0);
118
119 default:
120 fprintf(stderr, "Unknown option %c\n", opt);
121 break;
122 }
123 } // ... ...
134 interface = argv[optind]; // 指定接口, 这里的话第一个参数应该是要 -i 指定接口
// ... ...
139 s = socket(family, type, proto); // 申请一个套接字,我引用了这里
140 if (s < 0) {
141 perror("socket");
142 return 1;
143 } // 指定家族
145 addr.can_family = family;
146 strcpy(ifr.ifr_name, interface);
147 if (ioctl(s, SIOCGIFINDEX, &ifr)) {
148 perror("ioctl");
149 return 1;
150 }
151 addr.can_ifindex = ifr.ifr_ifindex; // ... ... 绑定
153 if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
154 perror("bind");
155 return 1;
156 } // 数据, 数据包的大小, 我修改了这里,这里我直接获取了qt界面上一个text 的属性。
158 for (i = optind + 1; i < argc; i++) {
159 frame.data[dlc] = strtoul(argv[i], NULL, 0);
160 dlc++;
161 if (dlc == 8)
162 break;
163 }
164 frame.can_dlc = dlc; // 扩展帧
167 if (extended) {
168 frame.can_id &= CAN_EFF_MASK;
169 frame.can_id |= CAN_EFF_FLAG;
170 } else {
171 frame.can_id &= CAN_SFF_MASK;
172 } // 远程帧, 远程帧是没有数据发送的请注意
174 if (rtr)
175 frame.can_id |= CAN_RTR_FLAG; // 这里是判断是否循环, 我参考了这里只发了一次,把循环条件去掉了。
185 while (infinite || loopcount--) {
186 ret = write(s, &frame, sizeof(frame));
187 if (ret == -1) {
188 perror("write");
189 break;
190 }
191 } // 关闭套接字
193 close(s);
194 return 0;
195 }

最新文章

  1. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use &#39;track by&#39; expression to specify unique keys
  2. 过河-状压DP
  3. CLR via C# 线程基础知识读书笔记
  4. echarts.js(图表插件)2.0版会导致 ZeroClipboard.js(复制插件)失效,3.0版未知。
  5. 【Python脚本】Eclipse IDE扩展PyDev插件安装
  6. TRIZ系列-创新原理-29-气动或液压结构原理
  7. POJ 1252 Euro Efficiency
  8. gridview属性
  9. POI处理Excel中的日期数据类型
  10. MySQL比like语句更高效的写法locate position instr find_in_set
  11. python3 第十六章 - 函数
  12. ionic2中使用极光IM的WebSDK实现即时聊天
  13. React-Native:解决真机调试时候Could not get BatchedBridge, make sure your bundle is packaged properly
  14. Java类更改常量后编译不生效
  15. UVA225-Golygons(dfs)
  16. tcp的发送端一个小包就能打破对端的delay_ack么?
  17. WCF学习笔记一之通过配置web.config可以通过http访问接口
  18. Django Web开发学习笔记(5)
  19. 360搜索引擎取真实地址-python代码
  20. vue 移动端添加 时间日期选择器

热门文章

  1. Android -- 利用Broadcast开启Service
  2. tomcat部署java web项目遇到的一些小问题
  3. Qt 之 QtConcurrent
  4. java使用链栈实现迷宫求解
  5. Minimum edit distance(levenshtein distance)(最小编辑距离)初探
  6. 算法笔记_143:构造无向图的欧拉回路(Java)
  7. sublime text 全局搜索快捷键
  8. LaTeX去掉默认显示日期时间
  9. JAVA学习第三十二课(经常使用对象API)- 基本数据类型对象包装类
  10. SQL 关于apply的两种形式cross apply 和 outer apply, with cube 、with rollup 和 grouping