您当前的位置: 首页 >  嵌入式

风间琉璃•

暂无认证

  • 0浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

2021年嵌入式第十二届省赛真题解析

风间琉璃• 发布时间:2022-02-23 18:02:24 ,浏览量:0

一、题目

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57yW56iL5bCP54aK,size_20,color_FFFFFF,t_70,g_se,x_16

 

二、分析

题目要求设计一个停车计费系统,界面显示,参数设置都比较简单,本题的难点在于串口的控制整个计费系统。主要是在对于串口发送的字符串进行处理。

串口发送数据格式:停车类型:车辆编号:进入/出去时间(YYMMDDHHmmSS),基本上每一个数据都需要使用。对于要存储不同类型的数据,使用结构体来存储信息。

// 关于车信息的数据类型
typedef struct
{
	uint8_t type[5];// 停车类型
	uint8_t id[5];  // 停车id
	uint8_t year;
	uint8_t month;
	uint8_t day;
	uint8_t hour;
	uint8_t min;
	uint8_t sec;
	uint8_t empty_flag; // 空位判断
}Data_Type;

Data_Type Car_Data[8];//8个车位

这里不仅将车的信息添加到结构体里面还多添加了一个变量用于判断某一个车位的使用情况。

 

串口发送的数据大小总共22个字节,需要对串口数据进行校验检查,先核对数据长度作为第一次检测,在串口中断里面一次接收一个字节并存储在buffer里面,然后再存储再rx_buffer数组里面。

//串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	rx_buffer[rx_index++] = buffer;
	HAL_UART_Receive_IT(&huart1, &buffer, 1);
}

 检测数据格式是否有误

/*检查串口信息*/
uint8_t check(uint8_t* str)
{
	uint8_t i=10;//  检测时间
	if(rx_index == 22)
	{
		//停车类型判别
		if((str[0]=='V'||str[0]=='C') && str[1]=='N' && str[2]=='B' && str[3]=='R')
		{
			for(i=10;i='0'&&str[i]12||day>31||hour>23||min>59||sec>59)
		{
			seed_err();
		}

检测完毕后,就需要在车库里面判断该车是否是第一次到,若是则将车入库,即将车的信息存入到Car_Data结构体。若不是,则说明车是出库,需要进行计费计算。

// 检测该车是否到车库里
		substr(car_id, rx_buffer, 5, 4);//提取车的id
		substr(car_type, rx_buffer, 0, 4);	//提取车的类型
		
		if(isExist(car_id)==0xFF) //车第一次来,入库
		{
			uint8_t pos= findLocate(); //找空的车为位
			if(pos==0XFF) //车库满了
			{
				seed_err();
			}
			
			substr(Car_Data[pos].type, car_type,0,4);
			substr(Car_Data[pos].id,car_id,0,4);
			Car_Data[pos].year=year;
			Car_Data[pos].month=mon;
			Car_Data[pos].day=day;
			Car_Data[pos].hour=hour;
			Car_Data[pos].min=min;
			Car_Data[pos].sec=sec;
			Car_Data[pos].empty_flag=1; //置1表示该为有车了
			
			if(Car_Data[pos].type[0]=='C')
				cnbr_num++;
			else
				vnbr_num++;
			
			idle_num--;
		}
		else  //车在库里面,车出库
		{
			int64_t total_sec;int64_t total_hour;float price;
			uint8_t locate = isExist(car_id);//获取空位置
			if(strcmp(car_type,Car_Data[locate].type) != 0)
			{
				seed_err();
			}
			total_sec=(year-Car_Data[locate].year)*365*24*60*60 + (mon-Car_Data[locate].month)*30*24*60*60+\
				(day-Car_Data[locate].day)*24*3600+(hour-Car_Data[locate].hour)*3600+\
				(min-Car_Data[locate].min)*60 + (sec -Car_Data[locate].sec);
			if(total_sec            
关注
打赏
1665385461
查看更多评论
0.0503s