蓝桥杯嵌入式15届国赛,轻松解决——附满分工程链接
本文分享了蓝桥杯嵌入式第15届国赛的两个核心难点及解决方案。首先针对不定长数据接收与解析,建议使用strncpy和sscanf函数处理数据格式校验。其次对于运动轨迹问题,提出分解速度向量法,通过三角函数计算X/Y轴分量,在定时器中断中实时更新位置。文章还介绍了坐标点队列的动态处理机制,并提供了满分工程代码的获取方式。解决方案融合了串口通信处理和物理运动学计算,代码简洁高效,适合竞赛场景。
蓝桥杯嵌入式15届国赛
前言
以下内容仅代表个人观点,基于有限的经验和认知整理而成。每个人的视角和背景不同,观点难免存在差异或局限。若存在疏漏或不足之处,欢迎指正与探讨,但请多一份包容。希望通过这些思考,能激发更多有益的交流。
——
观点无高下,讨论有温度
题目








两个难点:
我认为15届国赛的有两个难点:
1、接收不定长数据判断有无对错,并从中提取想要的数据。
2、怎么处理运动行经问题。
对于第一点:
首先了解strncpy函数:
然后定义一个字符串数组用来接收暂时存储串口接收到的数据
char input[50]; // 输入缓冲区
然后写
这样就可以去掉前后的括号后就只剩数字和’,’了,就只需要处理这个两种情况就好了。
对于后续字符串分割有两个方法:
- 第一种方法就是strtok_r(分割函数)和atoi()–将字符串转换成整数
- strtok_r()为分割函数
- atoi()为将字符串转换成整数
关于strtok_r函数:
功能:线程安全的字符串分割函数,用于将字符串按指定分隔符拆分成多个子串。
参数:
char *str:要分割的字符串(第一次调用时传入),后续调用传入NULL
const char *delim:分隔符字符串
char **saveptr:用于保存分割位置的指针,保证线程安全
例如:
第一次调用传入待分割字符串和分隔符 */
token = strtok_r(input_d, ",", &clcptr);
然后后续继续调用传入的是NULL
token = strtok_r(NULL, ",", &clcptr);
完整伪代码:
token = strtok_r();
while (...)
{
x=atoi(token);
token = strtok_r;
y = atoi(token);
// 继续获取下一组坐标的X坐标
token = strtok_r;
}
- 第二种方法就是sscanf(推荐)

Sscanf就当成拆分函数来用,和sprintf相反。
Sscanf可以有返回值,也可以没有。简单来说返回值就是成功分解了多少个
然后定义一个变量num用来接收sscanf的返回值,判断input的格式是否出现问题,有无多个连逗号,格式是否(%d,%d,%s)来排布
例:**num = sscanf(input, "%d,%d,%s", &xx, &yy, input);**
举例子
(48,92,90,100,200,3,20,60)经过去前后括号得:48,92,90,100,200,3,20,60
执行sscanf后
num=3
xx=48
yy=92
input=90,100,200,3,20,60
然后while循环一次提取一组坐标,然后用一个数组input存储剩下的字符。
如果没有错误的,以此循环,等到一组组坐标。
到现在,串口不定长和坐标的处理问题就解决了。
对于第二点:
我个人的想法是:用分速度来行进。运用了高中的物理有一点点数学知识。
斜边的长度用L表示,
所以我们可以通过算两个点的坐标来算x轴和y轴方向的速度。
Vx =Vcos;Vy =Vsin;
Sin=yy/L;
Cos=xx/L;
然后就可以分别X和Y算行进的速度了,
注意:行进方向可以向前也可以向后,所以这个xx和yy需要有正负,不能用无符号整型。
然后可以把更行速度放在定时器中断里面,确保实时更行数据。
写作思路:
1、用当前位置加上速度;
2、算完当前速度后,算距离下一个坐标点的距离。
3、计算一次运动的距离,并判断当前坐标点离下一个坐标点的距离是否小于一次的运动距离,若小于则可以判断达到此坐标。
4、到达此坐标后,删除该坐标点,并让后面的坐标向前移动一位。
5、记录好当前坐标和下一个坐标后,就重复上述步骤,就可以轻松完成全部任务啦。
希望我的写作思路对你有用。
满分工程
4t满分工程,思路简单,代码量少
总结
把这两个难点解决了,其他的就很好解决啦。
此文仅代表个人愚见。
其他届的工程及解析
更多推荐



所有评论(0)