⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rec_analysis.c

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 C
字号:
#include "recframe.h"
#include "Rec_Analysis.h"
#include "process.h"
/*********************************************************************
* 函 数 名: Rec_Analysis
* 功能描述: 判断每一个接收字节,进行状态转移,置标识位
* 函数说明: 帧头68H,帧尾16H
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void Rec_Analysis(void)
{
	uchar ch,i;
	static uchar RecCount,RecState,count, DataLen,cs;
	
  if(s_end==0) //数据没有发送完,返回
			return;	
  
	ch=SBUF;
	RecBuf[RecCount]=ch; //将接收到的字节存入缓冲区
  RecCount++;
    	
	switch(RecState)
	{
		case RS_WAIT:
								if(ch==FRAME_START_CHAR) 
								{
									    RecState++;
									    count=1;
								}
								else
									    RecCount=0;						
								break;

		case RS_HEADER:
								count++;
			    
								if(count==5)
			  				{
											if(RecBuf[4]!=FRAME_START_CHAR)     //若不是帧起始字符,返回到等待状态
											{
														RecCount=0;
        								    RecState=RS_WAIT;
														break;
											}
								}  

       				 if(count==6)
			  			 {
									fc_flag=0;
									switch(RecBuf[5])
									{	 					    
										case 0:
													fc_flag=0x00;						   
													break;
										case 1:
													fc_flag=0x01;
													break;
										case 2:
													fc_flag=0x02;						   
													break;
										case 4:
													fc_flag=0x04;
													break;
										case 5:
													fc_flag=0x05;
													break;
										case 6:
													fc_flag=0x06;
													break;
										case 7:
													fc_flag=0x07;
													break;
										case 10:
													fc_flag=0x0a;
													break;										
										case 11:
													fc_flag=0x0b;
													break;
										case 12:
													fc_flag=0x0c;
													break;
										default:
													RecCount=0;
          						    RecState=RS_WAIT;
													break;
									}
							}

			   		 if(count==7) //第7个字节为数据域长度字节
			   		 {
									DataLen=ch;	
									if(ch==0)	 RecState++;
									RecState++;
									count=0;
									break;				
	    			}	
						break;

		case RS_DATA:
						count++;
			    	if(count==DataLen) 
										RecState++;
						break;

		case RS_CHECK:
						cs=0;
						for(i=0;i<RecCount-1;i++)
								   cs+=RecBuf[i];
						if(cs!=RecBuf[RecCount-1])                       //校验和不正确,返回到等待状态
			 	   	{
									RecCount=0;
                  RecState=RS_WAIT;
									break;
						}
			    	else  
									RecState++;
						break;

		case RS_END:
            RecState=RS_WAIT;	
						if(ch==FRAME_END_CHAR) //如果帧结束字符正确,置接收结束标识位
			    	{
									r_end=1;
									p_end=0;
									s_end=0;			
									RecCount=0;
									rec_lamp=!rec_lamp;
						}
						else
									RecCount=0;
						break;
		} 
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -