UAVCAN速成大法

本文介绍了UAVCAN通信框架,包括基本概念如广播消息、服务消息和节点ID动态分配。详细讲解了V0版本的底层传输协议,包括CAN2.0和CAN FD的支持以及帧头帧尾的结构。此外,还展示了节点ID的动态分配过程,通过一系列CAN消息交换完成。同时,文章提及了UAVCAN-V0在AOA-F(imx6-linux)上的移植,包括代码收集、交叉编译和工具使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.UAVCAN基本概念

1.1框架

  • 理念

UAVCAN设计理念是为泛载具、机器类应用提供基础的,非领域限定的一种通信机制,并为该类应用中大量使用的设备定义了通用协议。UAVCAN不涉及到具体设备的应用。UAVCAN设计为低状态机架构,增强可靠性。

  • 通信机制

广播消息:节点以一个端口ID,发布信息;也可以订阅任一端口对应的信息;

服务消息:节点可以向另一个节点发送请求消息,类似于CS架构;

注:每个接入设备为一个节点(node),消息及协议以端口(port)区分。广播消息端口(message--使用subject identifier)和服务消息端口(service--使用service identifier),统称为端口(port identifier)。

  • 节点

单个设备可以占用并实现单个或多个节点。

  • DSDL语言(本文不涉及定制协议,未深入研究)

DSDL语言是一个类C语言的语义解释器,用于将这种类C语言的描述,使用python工具生成协议。UAVCAN由此定义协议,包括广播消息和服务消息。DSDL中可使用文件路径类似命名完成像C中include的操作,进而引用其它文件中定义的类型(不一定是这个目的,猜测),并由此完成类型定义与协议描述文件拆分(不一定是这个目的,猜测)。即DSDL所有协议均为静态生成。

协议文件名中显示定义了协议的端口和版本:

  • 协议端口定义

V1.0协议端口,分另为标准端口(UAVCAN定义),注册端口(各领域自定义,UAVCAN/SIG审核),开放端口。

V0协议端口

1.2底层传输协议

底层传输协议V0(旧版本协议,当前设备here3和CUAV的GPS使用)

仅描述使用CAN使用发送通道的情况,不描述使用UDP、serial等。

支持CAN2.0,使用扩展帧,最大包负载长度8字节。

支持CAN FD,使用扩展帧,最大包负载长度64字节。(未尝试)

  • 帧头占用扩展帧,定义如下:

Priority优先级:0为最高优先级,31最低,与CAN基础协议定义一致

Message type ID消息ID:即协议中的消息ID,查阅协议具体定义。

Service type ID服务ID:即协议中服务ID,查阅协议具体定义。

Node ID节点ID:设备节点号,0为保留ID,代表未知节点或所有节点。该节点ID在自动分配ID的过程中,未分配成功时为0。

Discriminator区分码:在ID自动分配的过程中,未完成分配前,所有未分配的节点ID为0,即会产生ID重复冲突。为避免这种情况,每个设备在未被分配时,会随机生成一个区分码,并广播自己的12位设备唯一码的前6位,请求分配员给自己分配ID,分配成功后,一般不再发送匿名广播消息(anonymous message frame)。

  • 帧尾

单帧数据量太小,为适应多帧发送,便于拼接,在帧尾增加拆分信息。

发送单帧时,起始与结束标志均为1,翻转标志为0。

发送多帧时,第一帧数据中前两个字节为CRC,起始标志为1,结束标志为0,翻转标志为0。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值