当前位置: 首页 > article >正文

SocketCAN

socketcan是Linux上的CAN协议(控制局域网).

为什么不使用字符设备,要使用socketCAN?

大多数字符设备实现一次只支持一个进程打开设备,类似于串行接口。更换 CAN 控制器需要使用另一个设备驱动程序,并且通常需要使应用程序的大部分内容适应新驱动程序的 API。

Socketcan的出现克服所有这些局限性。

使用socketCan

像注册网络协议一样打开socket,传递CAN协议.

2种CAN协议:

s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM);

创建完成需要进行绑定(bind),发送使用send、sendto、sendmsg,接收使用recv。

以下代码是创建一个CAN套接字并将其绑定到指定CAN接口(如can0)的示例:

int s; // 定义套接字文件描述符
struct sockaddr_can addr; // 定义CAN套接字地址结构
struct ifreq ifr; // 定义网络接口请求结构

// 创建CAN套接字
// PF_CAN: 协议族为CAN
// SOCK_RAW: 使用原始套接字类型
// CAN_RAW: 使用原始CAN协议
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);

// 设置要绑定的CAN接口名称(例如"can0")
strcpy(ifr.ifr_name, "can0");

// 使用ioctl获取CAN接口的索引号
// SIOCGIFINDEX: 获取接口索引
ioctl(s, SIOCGIFINDEX, &ifr);

// 配置CAN地址结构
addr.can_family = AF_CAN; // 地址族为CAN
addr.can_ifindex = ifr.ifr_ifindex; // 设置CAN接口索引

// 将套接字绑定到指定的CAN接口
bind(s, (struct sockaddr *)&addr, sizeof(addr));

// (..) 在这里可以继续编写其他逻辑,例如接收或发送CAN帧

CAN结构体框架:

CAN帧结构和sockaddr结构


http://www.kler.cn/a/520577.html

相关文章:

  • WebSocket 心跳机制:确保连接稳定与实时性
  • 【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权
  • ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”
  • 【MySQL】--- 复合查询 内外连接
  • 使用scikit-learn中的KNN包实现对鸢尾花数据集或者自定义数据集的的预测
  • oracle 分区表介绍
  • [特殊字符]【计算机视觉】r=2 采样滤波器全解析 ✨
  • leetcode_链表 876.链表的中间节点
  • 利用Redis实现数据缓存
  • docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令
  • PHP反序列化练习
  • Semantic Kernel - Kernel理解
  • 719.找出第K小的数对距离(双指针、K值问题)
  • On to OpenGL and 3D computer graphics
  • 【C++高并发服务器WebServer】-8:终端、进程组、会话、守护进程
  • git回退
  • 家居 EDI:Haverty‘s EDI 需求分析
  • 【Postman接口测试】Postman的常见断言
  • 【数据结构】空间复杂度
  • P1177 【模板】排序