afcan 通常是 Linux 符号 AF_CAN 去掉下划线后的写法,指 SocketCAN 使用的 CAN 地址族。它让应用程序通过 Linux 套接字接口收发 CAN 总线报文。简而言之,AF_CAN 说明套接字面向 CAN 网络;它不是一种新的 CAN 协议,也不是 CAN 控制器或物理总线的名称。
AF_CAN 这个名称怎么理解
AF 是 Address Family(地址族)的缩写,CAN 指 Controller Area Network,即控制器局域网。Linux 创建套接字时,会用地址族选择通信对象:例如面向 IPv4 的套接字使用 AF_INET,面向 CAN 网络的套接字则使用 AF_CAN。因此,afcan 这个写法通常出现在 Linux 驱动、嵌入式开发、CAN 报文收发程序等语境中。
代码里常见的 PF_CAN 与 AF_CAN 也容易让人混淆。PF 表示 Protocol Family(协议族),AF 表示 Address Family;在 SocketCAN 的常用接口中,二者都用于指定 CAN 套接字这一通信域。阅读程序时,看到 socket(PF_CAN, ...) 或 socket(AF_CAN, ...),重点都是它将套接字连接到 CAN 通信栈,而不是普通的 TCP/IP 网络。
它在 CAN 通信链路中负责什么
AF_CAN 位于应用程序与 Linux CAN 网络设备之间。应用程序创建 CAN 套接字、选择具体协议、绑定到某个 CAN 接口,再发送或接收帧;内核网络栈负责把报文交给对应设备驱动,驱动再与 CAN 控制器协作完成总线收发。接收方向则由控制器和驱动将收到的帧传回内核,应用程序从套接字读取。
可以把这条链路理解为“应用程序—SocketCAN—CAN 网络接口—驱动与控制器—CAN 总线”。其中 AF_CAN 负责确定套接字的通信范围,CAN 接口负责承载网络报文,控制器负责总线上的实际发送和接收。它本身不会设定波特率,也不会替代接口驱动或硬件控制器。
常见套接字如何对应到实际报文
以原始 CAN 套接字为例,应用程序通常选择 CAN_RAW 协议,通过 sockaddr_can 绑定一个接口。接口名可能是实体设备对应的 can0,也可能是用于测试的虚拟接口 vcan0。绑定完成后,程序可以发送 CAN 帧,也可以按标识符等条件接收感兴趣的帧。
socket(AF_CAN, SOCK_RAW, CAN_RAW)
这行代码体现了三个层次:AF_CAN 选择 CAN 地址族,SOCK_RAW 表示使用原始套接字,CAN_RAW 选择原始 CAN 报文协议。实际程序还要找到接口索引并填写绑定地址。套接字创建成功并不意味着总线已经具备通信条件;接口状态、驱动、控制器配置和物理连接仍各自承担相应职责。
原始套接字适合需要直接处理 CAN 帧的场景。SocketCAN 还提供其他协议类型,例如 CAN_BCM 可用于按规则进行报文周期发送或监控,CAN_ISOTP 则面向 ISO-TP 传输。它们都可以建立在 CAN 地址族之上,但处理层级与应用目的不同,不能仅凭 AF_CAN 判断程序采用了哪一种报文协议。
AF_CAN 与 CAN、CAN FD、FDCAN 的区别
CAN 是总线通信技术;CAN FD 是扩展 CAN 帧格式与传输能力的技术;AF_CAN 则是 Linux 应用访问 CAN 网络的接口入口。三者分别处于总线协议、帧格式和操作系统 API 等不同层次。一个程序使用 AF_CAN,并不自动表示它正在收发 CAN FD 帧;是否支持并启用 FD,还取决于内核、驱动、控制器及套接字配置。
FDCAN 常出现在微控制器或芯片资料中,通常指支持 CAN/CAN FD 的控制器外设或相关控制器模块。它和 AF_CAN 并非同一类名称:前者偏向硬件控制器,后者偏向 Linux 软件接口。若 Linux 设备使用了 FDCAN 控制器,需要由相应驱动把硬件接入系统网络栈,应用程序才能通过 CAN 接口和 AF_CAN 套接字进行通信。
在什么场景会看到 afcan
在 Linux CAN 示例代码中,afcan 常与 socket、bind、CAN_RAW、sockaddr_can 等词一起出现,说明讨论的是应用如何接入 CAN 网络。在内核或驱动讨论中,它可能指地址族的注册与协议分发;在嵌入式项目中,它也可能与 can0、CAN FD 帧或 FDCAN 外设同时出现,但这些词对应的层次仍然不同。
理解 afcan 的关键,是把它看作“Linux 中面向 CAN 的套接字地址族”。它提供应用与 SocketCAN 之间的入口,不等同于报文标识符、总线速率、物理接口或控制器型号。弄清这一层级,就能读懂 AF_CAN 示例为何要创建套接字、绑定网络接口,并进一步区分原始帧收发、CAN FD 支持与硬件 FDCAN 功能。
