蓝桥嵌入式第十二届省赛做题思路分享及部分功能实现
本篇文章依旧是仅有思路分享,实现部分也只会提供框架函数,函数里需要补充的具体内容可自行补充。希望对正在学习或是做题备考的你能够有所帮助。对于本届省赛题,其实也是考的串口的实现,但更多还是考思维,所有省赛题目基本上考的就是一个工程思维,一旦思维成型了,做题时思路清晰后,快的话半小时多就能将功能全部实现。个人建议就是比赛时提前画好思维导图or基本框架,剩下的都是“房子”的装修,一点点实现然后加分的过程
目录
前言
本篇文章依旧是仅有思路分享,实现部分也只会提供框架函数,函数里需要补充的具体内容可自行补充。希望对正在学习或是做题备考的你能够有所帮助。
思路
提取题目关键信息

首先需要理解其运行过程,先由串口传入一串规定的字符串,若是第一次传入,则将“车”的信息存入车库系统内,若是第二次传入,则代表车即将出库,需要计算时间以便进行收费处理。
话不多说,直接看思维导图。
思维导图

步骤分析
判断
首先需要判断的是什么?
“我知道!是判断这辆车是否有存在过。”
说得好,下次别说了(bushi
首先要判断的是串口所传输来的字符串是否合规(即符合题目要求)。那么条件又哪些呢?
1、字符串的长度是否为22;
2、第五个位和第十个位是否为':' 即[4]==':' && [9]==':' 那么为什么是索引4和索引9呢?我拒绝回答。(索引是从0开始的呀,宝)
3、时间是否符合规定。(year<=99,month<=12,day<=30,hour<24,min<60,second<60)
下面有具体函数。
车有无存在过
接着才是判断车是否存在过。那判断的话,就需要通过车牌号来判断。这里有一个细节,就是不清楚不同类型的车是否可以出现相同的车牌号,这里就默认是可以的吧。不管那么多了,效果差不多。(希望下次出题仔细点,说你呢出题人(保命符...))
车有存在过(无存在过方法类似)
将取到的车牌号num与C类(或V类)车进行判断。可以用字符串判断函数也可以每个字符取出来单独判断。num也就四个字符,单独判断也可以。
(提供一个不知道怎么想出来的判断函数给大家看看,以C类车为例)
bool yw_p_C(void){
int i,j;
int temp=0;
for(i=0;i<8;i++){
for(j=0;j<4;j++){
if(CNBR[i].num[j]==num[j]){
temp++;
}
}
if(temp==4){
return 1;//说明有四个符号都相同的,也就是有这辆车了。
}else{
temp=0;//说明本轮(第i轮)没有相同的,故到下一轮判断。
}
}
return 0;//期间没有return 1;的说明就没有这辆车。
}
函数框架
在介绍框架前先做一下两个处理吧。
串口接收处理
首先是串口接受处理。如果还不清楚串口如何传输一串字符串,可以看一下这篇文章。蓝桥嵌入式第十三届省赛串口传输分享
下面要介绍的是字符串的分散处理(拆开,分为类型type,车牌号num,和时间time三个部分),当然不拆开也是可以的,只是拆开后更方便判断。
可以用到<stdio.h>库里的一个函数——sscanf();
示范一下用法:
int year,month,day;
sscanf("2023 04 06","%4d %2d %2d",&year,&month,&day);
那么在具体使用的时候就可以
sscanf(val,"%4s:%4s:%12s",type,num,time);
/*======================================================
Val是接收到串口传输字符串用于存储的数组,里面的内容就是:
CNBR:D581:200202132500 格式的,刚好有两个冒号':'
形成sscanf自然的换下一个数组来存储
======================================================*/
字符串异常判断
可以定义一个bool类型的函数
bool r_p(void){
if(uart_x!=22){
return 0;
}else{
if(val[4] != ':' || val[9] != ':'){
return 0;
}else{
return 1;
}
}
}
这里我没有写时间的判断,因为懒,就说一下写时间判断的思路吧。
从time数组里,比如需要秒的,就取出time[11]和time[10]
second=time[11] - '0' + 10*(time[10]-'0');
其他的也同理,声明一下,都是要取的,因为后面计算存储时间还是需要的用到的
具体框架
void uart_use(void){
if(/*传输的字符是否合规*/){
//是
/*判断有无*/
//分类型判断
if->C //无{ /*存*/ count_c++;count_k--;memset(type,0,4);memset(num,0,4);memset(time,0,4);}//C类型车数量+1,空位数量-1,并且清空传入的字符串
else//有 { /*出*/ /*算time算money*/ count_c--;count_k++;memset(CNBR.type,0,4);memset(CNBR.num,0,4);memset(CNBR.time,0,4);}/C类型车数量-1,空位数量+1,并且清空该车辆的信息
/*V类同理*/
}else{
//输出Error
}
}
总结
对于本届省赛题,其实也是考的串口的实现,但更多还是考思维,所有省赛题目基本上考的就是一个工程思维,一旦思维成型了,做题时思路清晰后,快的话半小时多就能将功能全部实现。
个人建议就是比赛时提前画好思维导图or基本框架,剩下的都是“房子”的装修,一点点实现然后加分的过程。
更多推荐



所有评论(0)