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

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

imx6 socketcan 发送问题的更多相关文章

  1. Linux SocketCan client server demo hacking

    /*********************************************************************** * Linux SocketCan client se ...

  2. am335x Qt SocketCAN Demo hacking

    /*********************************************************************************** * am335x Qt Soc ...

  3. PHP实现RTX发送消息提醒

    RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...

  4. WPF 微信 MVVM 【续】发送部分QQ表情

    今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTex ...

  5. [转]利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  6. RestTemplate发送请求并携带header信息

    1.使用restTemplate的postForObject方法 注:目前没有发现发送携带header信息的getForObject方法. HttpHeaders headers = new Http ...

  7. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  8. C#发送邮箱

    之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...

  9. XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

    SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...

随机推荐

  1. 将项目的版本控制从Vss迁移到Git

    之前在Vs2008上一直使用的是Vss版本控制,现在将版本控制更改为Git 迁移原因是其他公司想要在我们公司开发的一个CRM系统做一些定制(个性化需求,将软件上的公司名称和链接更改为他们的或一些跟我们 ...

  2. java开发struts2项目遇到FilterDispatcher过时

    由于工作需要,再次需要写一些简单的Java代码了,曾经的Java编程历历在目,但是却再也找不到以前的感觉了.于是便怀着对儿时Java的记忆,再次踏上Java Web Project. 在此特别鸣谢:h ...

  3. HashMap的工作原理--重点----数据结构示意图的理解

    转载:http://blog.csdn.net/qq_27093465/article/details/52209814 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都 ...

  4. 转自http://bbs.linuxtone.org/thread-1062-1-1.html

    详细参考:http://wiki.codemongers.com/NginxChsHttpMainModule worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就 ...

  5. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  6. QtGui.QCalendarWidget

    A QtGui.QCalendarWidget provides a monthly based calendar widget. It allows a user to select a date ...

  7. 在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)

    转自:http://blog.csdn.net/season_hangzhou/article/details/36423223 一.安装硬盘到物理机上. 二.查看硬盘是否正确安装. 使用“fdisk ...

  8. 解决ssh登录Host key verification failed

    使用SSH登录某台机器,有时因为server端的一些变动,会出现以下信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: R ...

  9. linux下vi编辑文件

    vi 文件名.进入读文件模式 按i进入编辑模式 按g切光标换到第一行,按G光标切换到最后一行. 按Esc退出编辑模式 :q退出 :wq保存退出 以上命名后面加上!表示强制运行

  10. FFmpeg音视频同步示例

    原文地址:https://my.oschina.net/u/555002/blog/79324 前面整个的一段时间,我们有了一个几乎无用的电影播放器.当然,它能播放视频,也能播放音频,但是它还不能被称 ...