项目简介
由AI生成,具体实现以原文为准
解决高波特率串口中碎帧、粘帧与错误帧处理的问题,将通信层和协议层分离。提供 STM32 下位机与 ROS 上位机两端实现。
01字节流与帧重组
提高波特率后,一条消息可能分批到达,多条消息也可能混在一批里。接收端必须按协议判断完整帧,不能把空闲中断直接当成消息边界。
01.1碎帧与粘帧
碎帧是完整消息被拆成多段,粘帧是多条消息一起到达。两种情况都说明硬件接收时机与应用消息边界不是同一件事。
01.2错误帧处理
高通信速率对抗干扰和错误帧处理提出要求,接收端结合帧重组与完整性检查处理错误数据和解包越界问题。
02通信层收发
通信层管理 DMA、缓冲区和外设,通过原子操作与程序流安排避免共享资源抢占,收发传输能力各为 2M。
02.1DMA 与缓冲区
DMA 和缓冲区负责字节收发与存储,应用协议负责解析消息内容,两部分职责独立。
02.2无锁处理
无锁设计通过原子操作与流程安排管理并发访问,避免对共享资源加锁。
03协议层扩展
协议层独立管理不同信息帧,用户增删或修改帧时可复用通信层。它回答“这条消息是什么”,通信层回答“这些字节怎样收发”。
04STM32 与 ROS 两端
SerialDriver-STM32 与 SerialDriver-ROS 分别实现下位机和上位机的通信收发与消息处理。
04.1下位机实现
SerialDriver-STM32 实现 MCU 侧的外设收发与下位机接口。
04.2上位机实现
SerialDriver-ROS 实现 ROS 侧的消息收发,与 STM32 端配套通信。
点击主题展开总结,子主题可继续展开;引用位于说明末尾。
原理说明字节流与消息边界
一帧可能分多次到达,多帧也可能一次到达。接收端需要按协议重组字节流并校验,不能把每次空闲中断直接当成一条完整消息。 [1]
引用与定位 · 8 处依据
项目简介与图解根据原帖及所引项目资料整理。图中分支表示内容分类,原理流程为概念说明。
随着Robomaster赛场上竞争一年比一年激烈,技术迭代水平一年比一年迅速,机器人的代码逻辑也一年比一年复杂,在这种形势下,我们对上下位机的通讯带宽与质量必然需要提出更高的要求。在赛季初期,为了提高通讯速率,我们简单在旧有的通讯模块的基础上直接拉高了波特率,然而效果并不理想,总结如下:
- 随着波特率的增大,上位机下发的信息帧往往呈现出离散化与碎片化的趋势。譬如,两个乃至多个信息帧会杂糅在一起下发,而这个过程仅触发过一次空闲帧;有的时候一个信息帧会拆成多个碎片下发给下位机,而这个过程反而会产生多个空闲帧。
- 在通讯速率提高的同时,信号的抗干扰能力也会随之下降,帧传输错误率也会必然提高,如何在正确地处理这些错误帧的同时防止解包越界等异常操作成为了我们新的研究课题。
- 在这个的赛季我们采用了双头哨兵方案, 上下位机交换的信息多而杂,因此,我们需要在驱动的协议层面设计一种兼容性强的框架来支持对不同信息帧的IO管理。
- 通讯模块暴露出的调用接口应该在保证绝对线程安全性的同时,最大化地利用MCU系统资源如DMA、缓冲区内存以及外设等,以支持高性能的信息吞吐。
之后,我们历经一个月的研发与测试,最终完成了新一代上下位机通讯模块。该模块具有如下特点。
- 高速: 经过测试,该通讯模块可以达到双工4M(收发各2M)的稳定传输速率 (CRC错误率 < 0.01%)
- 无流控:不需要额外使能CTS与RTS功能,不仅节省了IO引脚还间接地提升了通讯效率。
- 无锁:通过巧妙地使用原子操作及设计程序流来规避给共享资源上锁,在避免共享资源抢占的同时提升了系统运行的效率。
- 协议层解耦: 通讯层与协议层分离,方便用户快速地添加、删减修改传输接收的信息帧,同时复用通讯层的功能。
在Robomaster 2024的海外赛区及复活赛中,我们在每台机器人上都部署了该通讯方案,并验证了其稳定性。现决定将其开源,以供大家学习点评交流。
下位机方案开源: https://github.com/hkustenterprize/RM2024-SerialDriver-STM32
上位机方案开源: https://github.com/hkustenterprize/RM2024-SerialDriver-ROS
CITED BY谁引用了本项目 2
已核实并记录 2 条公开引用来源,同一来源页面只计一条。
讨论区 0
原帖暂无评论。