目录

前言

思路

思维导图

 步骤分析

判断

车有无存在过

车有存在过(无存在过方法类似)

函数框架

串口接收处理

字符串异常判断

具体框架

总结


前言

本篇文章依旧是仅有思路分享,实现部分也只会提供框架函数,函数里需要补充的具体内容可自行补充。希望对正在学习或是做题备考的你能够有所帮助。

思路

提取题目关键信息

bd2e216ad6b84aa0acc8fbe1d17e5445.jpeg

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

话不多说,直接看思维导图。

思维导图

f11c52f07f3c4772a6593e76fd2cce7d.png

 步骤分析

判断

首先需要判断的是什么?

“我知道!是判断这辆车是否有存在过。”

说得好,下次别说了(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基本框架,剩下的都是“房子”的装修,一点点实现然后加分的过程。 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐