# NEUQ_ICR_1801_TC264_Slave **Repository Path**: icr18-neuq-btl143/NEUQ_ICR_1801_TC264_Slave ## Basic Information - **Project Name**: NEUQ_ICR_1801_TC264_Slave - **Description**: 完全模型TC264下位机代码 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 0 - **Created**: 2022-10-17 - **Last Updated**: 2026-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NEUQ 第十八届智能车 - 完全模型组 - 下位机工程 > A wise man does not fall in love, but a fool is trapped by his feelings. ## 说明 该代码是十七届备赛较早期使用的验证代码(众所周知后面规则先是灵动微电子,然后次年三月份的时候零时更改为沁恒),所以很多内容都比较不成熟。 私以为完全模型下位机主要需要实现的就是 *通信 + PID*。 ### 通信 通信部分当时还使用最为简单的 **串口接收中断 + 状态机(标志位)** 的方式,通信帧为自定义定长帧。该方式的局限性在于需要在中断中实现解析,如果操作复杂耗时过多,可能会导致错过下一个有效数据的接收时机。后面更换为性能较差的 mm32spin27ps 之后该问题显得尤为明显。 后期比赛版本的代码中,仍然使用的是串口接收中断加状态机的方式。虽然修改了部分判断条件,但在 Edgeboard 高速下发的情况下,仍然存在丢帧的问题,只不过使用中一直在更新舵机打角和速度值,所以确实处于一个能用的状态。 对于上行数据,主要实现的功能是下位机一键发车功能(本仓库代码应该不包含)。下位机通过旋转编码器和操作手交互,当切换到发车菜单时,直接按下旋转编码器,下位机就会向上位机发送发车指令,这使得我们在比赛中发车流程显得比较方便,可以专注于发车过程而不是需要同时操作电脑,减少了由于忙乱而忘记按下计时器按钮等类似的问题。在 Linux 中解析串口协议帧要方便的多,由于设备即文件的思想,以及实现了接收缓冲区,使得我们可以*异步地*进行串口通信帧的解析。上行数据线被送入缓冲区中,然后解析程序按需读取并解析即可。需要注意的问题是 read 后数据即从缓冲区弹出,所以如果所取数据中不仅仅包含了当前帧的数据,可能会导致下一帧解析时丢失帧头等,需要做额外的处理。(如果有必要的话后面给出例子吧,也不知道些这些有没有人看) 后面做过一些项目后,对自定义的串口通信协议的发送和解析有了一些新的认识。后面的实现中主要采用 **串口接收中断 + 环形缓冲区 + 状态机(标志位)** 的方式解析,这样能够实现较高负载下较低的通信出错率。同时还看到有很多不一样的思路,如 **dma + 双 buffer** 或者 **串口空闲中断 + dma** 的方式,不过实现要复杂很多,没有深入探 9 究。 有一些可以参考的项目或者教程,可以参考: * 很好用的环形缓冲区,个人挺喜欢用这个作者的库 - [MaJerle/lwrb](https://github.com/MaJerle/lwrb) * 几种串口接收方式 - [MaJerle/stm32-usart-uart-dma-rx-tx](https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx) * 封装比较完善的串口通信协议,就是功能有点多 hh - [MightyPork/TinyFrame](https://github.com/MightyPork/TinyFrame) * Modbus 协议栈,解析部分可以借鉴 - [foxclever/Modbus](https://github.com/foxclever/Modbus) * linux 封装的低速外设库,可以使用高级接口调用串口,比较方便 - [vsergeev/c-periphery](https://github.com/vsergeev/c-periphery) ``` /* ......... ...mm*****=m.. ..xm**""""""""**mmuueWWWu.um""` `"*mu um"" $$$$$$$$` "*u. .@" $$$$$$$$ `*u .$` `*$$$$**mu..ueeu. *x .$` .... `` "I$$$$$$u $ !! :W$$$$$e $$$$$$$$ ?X `$ "****"" "$$$$$$$e. . ~$- m*U """" "*e. TWe. "W e$x `T@- u$$$$e *: ""*u. e" e$$$$$$U `$ "*mu.. :* x$$$$$$$$ "x """*mme.... !! u$$$$$$$$$! $ ``""""**m.. $`:$$$$$$$$$$! $! "*@. ...$ U$$$$$$$$$$! $~ W ..um****** *$$$$$$$$$$! $ $Weeu..x@""` !! $$$$$$$$$* xT $**$$$$$! `*u `*$$$$$$* :$ ...m*u..e"?xmx`"*$! "*x. """"" u@" ...$""W `$"U=" .@m: !! `"***mmm="" -$``* " :S.$ `-"?:U! $u ~$"" .u` $! .$"*W. "@.m***"" ~$ "u `"e. `" * .m"*m**""e .m ~U .e" "@. ..m*" $: X" "@"" ~$ :* .$ eem**. !! W! $` "*W! u$! $ ?! x$$ $ !X .$$$ $ $ `*$~ $ `@. x? $ ` .$ $ .@*@u $ x*W *u $ e. .u" "W "@u *: "*u. ..m*"` "W "@. ...m****mmmmmW$e..... .u@T" "mu.m@** u*""` ````""""***"` "m. `` :$" x*` .. "*m. !$ u" .$ $ `**********************************"" */ ```