第十二届蓝桥杯嵌入式省赛——串口部分

目录

1.赛题

2.分析

3.程序

3.1判断格式

3.2判断逻辑

3.3拆解字符串

3.4入库,出库

3.5串口主程序


1.赛题

2.分析

LED,按键,LCD显示较为简单,基本都有模版,可以参考:第十四届嵌入式方向省赛题解。重点分析串口功能:

1)接收数据的格式正确

2)接收数据的逻辑正确

3)接收数据的拆解:考虑到车辆入库,出库(判断出库的方法是在车库中可以找到该辆车),时间,价格计算等,需要将接收的数据拆解,用来登记或查询。

4)入库,出库判断,时间价格计算。——主要功能

5)需要用到的字符串函数有,strstr(),strcpy,strcmp(),sprintf();

strstr()——寻找字符串,并返回字符串起始地址

strcpy——复制字符串

stcmp——比较字符串,字符串相同返回0

sprintf——生成字符串

3.程序

先给出车库结构体数组

//为了节省空间,假设停车类型和车辆编号不重复,则不需要停车类型信息也可以完成功能
typedef struct{
	u8 car_number[5]; //编号
	u8 car_year;  
	u8 car_month;
	u8 car_days;
	u8 car_hour;
	u8 car_minu;  //分
	u8 car_mins;  //s
	u8 empty;  //empty = 0表示为空
}Car_message;
Car_message Car[8];

u8 i;
for(i = 0;i < ALL_Num;i++)  //初始化阶段清空车库
	memset(&Car[i],0,sizeof(Car_message)); 

3.1判断格式

u8 Judge_rule(u8 *Rx_Data)
{
	char *p1,*p2;
	if(strlen((char*)Rx_Data)!=24)	return 0; //包含'/r/n'
	p1 = strstr((char*)Rx_Data,"CNBR");
	p2 = strstr((char*)Rx_Data,"VNBR");
	if(p1== NULL && p2==NULL)  return 0; //存在CNBR,VNBR其中一个
	p1 = strstr((char*)Rx_Data,":"); //获取第一个冒号的地址
	p2 = strstr(p1+1,":"); //获取第二个冒号的地址
	if(p2-p1!=5)	return 0; //p2-p1与5比较而不是与4比较,得到编号个数
	return 1;
}

3.2判断逻辑

这里偷一下懒,主要是时间逻辑错误,如果考虑到闰年,闰月,year>365,month>12,day>31,hour>24等等,问题会很繁琐。因此只考虑出库时间<入库时间这一中错误。这一错误在进行时间计算时再进行判断。

3.3拆解字符串

这是非常关键的一步,将信息拆解后,对后续计算,信息登记等会有非常大的便利。可以减少工作量。

void Rx_Information(u8 *Rx_Data,u8* car_number,u8 *year,u8 *month,u8 *day,u8 *hour,u8 *minut,u8 *minus,u8 *car_type)
{
	char *p1,*p2;
	*year = (Rx_Data[10]-'0')*10+Rx_Data[11]-'0';
	*month = (Rx_Data[12]-'0')*10+Rx_Data[13]-'0';
	*day = (Rx_Data[14]-'0')*10+Rx_Data[15]-'0';
	*hour = (Rx_Data[16]-'0')*10+Rx_Data[17]-'0';
	*minut = (Rx_Data[18]-'0')*10+Rx_Data[19]-'0';
	*minus = (Rx_Data[20]-'0')*10+Rx_Data[21]-'0';
	p1 = strstr((char*)Rx_Data,":");
	p2 = strstr(p1+1,":");
	*p2 = '\0';
	strcpy((char*)car_number,p1+1);
	*p1 = '\0';
	strcpy((char*)car_type,(char*)Rx_Data);
}

3.4入库,出库

void Judge_Out_In(u8 *Rx_Data)
{
	u8 i,year,month,day,hour,minut,minus; //车辆信息
	u8 car_number[5],car_type[5];
	u8 string[20];
	float fee;
	int time;
	Rx_Information(Rx_Data,car_number,&year,&month,&day,&hour,&minut,&minus,car_type);
	for(i = 0;i<ALL_Num;i++) //出库
	{
		if(!strcmp((char*)car_number,(char*)Car[i].car_number))  //寻找车辆编号,找到则出库
		{
			time = (year-Car[i].car_year)*365*24*3600+(month-Car[i].car_month)*30*24*3600+(day-Car[i].car_days)*24*3600+(hour-Car[i].car_hour)*3600+(minut-Car[i].car_minu)*60+(minus-Car[i].car_mins);
			if(time < 0) //时间出现逻辑错误
				sprintf((char*)string,"Error\r\n");
			else
			{
				time = (time+3599)/3600;
				if(car_type[0] == 'C')
				{
					fee = time*cnbr_fee;
					CNBR_Num--;
				}
				else
				{
					fee = time*vnbr_fee;
					VNBR_Num--;
				}
				sprintf((char*)string,"%s:%s:%d:%.2f\r\n",car_type,car_number,time,fee);
				memset(&Car[i],0,sizeof(Car_message)); //出库后,清除信息
			}
			HAL_UART_Transmit(&huart1,string,strlen((char*)string),0xFFFF);
			return;
		}	
	}
	for(i = 0; i<ALL_Num;i++) //入库
	{
		if(Car[i].empty == 0) //寻找空位
		{
			strcpy((char*)Car[i].car_number,(char*)car_number);
			Car[i].car_year = year;
			Car[i].car_month = month;
			Car[i].car_days = day;
			Car[i].car_hour = hour;
			Car[i].car_minu = minut;
			Car[i].car_mins = minus;
			Car[i].empty = 1;
			if(car_type[0] == 'C')
				CNBR_Num++;
			else
				VNBR_Num++;
			break;
		}
	}
}

3.5串口主程序

void Rx_Pro()
{
	if(Rx_flag == 1)
	{
		if(!Judge_rule(RxBuff)) //判断格式
		{
			HAL_UART_Transmit(&huart1,(u8*)"Error\r\n",strlen("Error\r\n"),0xFFFF);
		}
		else  //入库出库处理
		{
			Judge_Out_In(RxBuff);
		}
		memset(&RxBuff,0,sizeof(RxBuff));
		Rx_flag = 0;
		Rx_cnt = 0;
	}
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 蓝桥杯是全国性的计算机大赛,旨在提高大学生的计算机技术水平和创新能力。嵌入式STM32G431是一款嵌入式芯片,具有高性能和低功耗的特点。第十二届第一场省赛停车计费系统是蓝桥杯的一道工程题目,要求参赛选手设计一个停车场计费系统。 停车计费系统是指通过嵌入式技术实现对车辆进入和离开停车场的自动检测、计时和计费的系统。对于这个题目,参赛选手可以根据题目要求,使用STM32G431芯片设计一个具有以下功能的系统: 1. 车辆进入检测:使用车辆传感器检测车辆的进入,触发计时。 2. 车辆离开检测:使用车辆传感器检测车辆的离开,停止计时。 3. 计时功能:使用内部时钟模块获取进入和离开的时间,并计算停车时间。 4. 计费功能:根据停车时间,按照一定的计费规则进行计费。 5. 显示功能:使用液晶显示屏显示当前的停车信息,如车牌号、停车时间、费用等。 6. 数据存储功能:使用闪存等储存介质将停车数据进行存储,以便后续的数据分析和查询。 设计一个停车计费系统涉及到硬件设计和软件编程两个方面。硬件方面,参赛选手需要选择合适的传感器、显示屏、存储介质等,以及设计电路和接口进行连接。软件方面,需要使用C语言或者汇编语言编写程序,对芯片进行编程,实现各项功能。 通过此次比赛,选手们可以锻炼嵌入式系统的设计能力和编程能力,了解实际应用中嵌入式系统的工作原理和应用场景。同时,也能提升对STM32G431芯片的理解和运用能力。这对于培养嵌入式技术人才,推动物联网技术的发展都具有积极意义。 ### 回答2: 蓝桥杯是面向计算机爱好者的智力竞赛,而嵌入式STM32G431是一款嵌入式系统开发板。第十二届第一场省赛的停车计费系统真题工程,则是要求参赛选手设计并实现一个能够进行停车计费的系统。 停车计费系统是一种用于自动计费和管理停车场的系统。这个系统可以通过识别车辆的进出以及停车的时间,自动计算并收费。在这个工程中,选手需要使用嵌入式STM32G431开发板以及相关的硬件和软件,来设计一个能够实现停车计费功能的系统。 首先,选手需要使用传感器或摄像头来实现车辆进出的检测。当车辆进入或离开停车场时,传感器会发出信号并通过STM32G431进行检测。接着,选手需要编程实现识别车辆的算法,以便能够识别不同的车辆。当车辆停放时,系统会通过计时器记录停车的时间。 然后,选手需要编写计费算法,根据停车的时间来计算费用。这个算法可以根据停车场的规则来确定费用的计算方式,例如按小时计费或按照不同的时间段采用不同的费率。 最后,选手还需要设计一个界面,使得系统能够与用户进行交互。用户可以通过该界面查询停车费用,并进行付款。同时,选手还需要保证系统的稳定性和安全性,确保数据的准确性和保密性。 总而言之,蓝桥杯嵌入式STM32G431第十二届第一场省赛停车计费系统真题工程要求选手使用硬件和软件开发能力,设计并实现一个完整的停车计费系统。这需要选手具备嵌入式系统开发、传感器技术、算法设计和界面设计等多方面的知识和技能。 ### 回答3: 蓝桥杯嵌入式stm32g431——第十二届第一场省赛停车计费系统真题工程是一个基于STM32G431开发板的停车计费系统设计题目。该系统的主要功能是实现停车场的车辆进入、出场的计费管理。 首先,该系统需要实现一个车辆进入检测的功能。当车辆进入停车场时,系统会通过传感器检测到车辆的到达,并记录下进入的时间。 然后,系统需要实现一个车辆出场的功能。当车辆准备离开停车场时,系统会通过传感器检测到车辆的离开,并记录下离开的时间。 接下来,系统需要计算车辆停留的时间。通过进入时间和离开时间的差值计算得出车辆停留的时长。 最后,系统需要计算停车费用。根据停车场的计费规则,根据车辆停留的时长计算出停车费用,并将费用显示在屏幕上。 在实现上述功能的过程中,需要运用STM32G431开发板的各种功能和模块,包括GPIO口、定时器、中断、串口通信等。通过编写相应的代码,实现按钮的控制、传感器检测、时间的计算以及屏幕的显示等功能。 该项目的设计需要考虑多种情况,比如车辆重复进入出场、车辆进入出场顺序错乱等,要充分考虑这些异常情况并进行相应的处理。在代码编写过程中,还需注意代码的优化和资源的合理利用,以提高系统的性能和效率。 通过完成这个项目的设计与实现,可以加深对STM32G431嵌入式系统的了解和应用,并提升嵌入式系统开发的能力。同时,也能锻炼自己的逻辑思维、问题解决能力和团队合作精神。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值