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 究。
有一些可以参考的项目或者教程,可以参考:
/*
......... ...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" .$ $
`**********************************""
*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。