//===========================================================================
//文件名称：isr.c
//功能概要：自定义中断服务例程源文件
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：2013-05-03  V1.0,2014-05-10  V2.3(WYH) 
//===========================================================================

#include "includes.h"
#include "app_inc.h"

#define FrameHead    (0x41)         //帧头
#define FrameTail    (0x44)         //帧尾
//内部函数声明
uint8_t CreateFrame(uint8_t Data);

//===========================================================================
//中断例程：UART4_RX_ISR
//功能概要：串口4中断服务例程，每收到一个字节执行一次本程序，发送回去，并组帧
//参数说明：user_isr_ptr（未使用）
//备注：内部调用的CreateFrame()子程序使用全局变量 g_UART_ISR_buffer[]     
//===========================================================================
void UART4_RX_ISR( pointer user_isr_ptr)
{
    uint8_t Redata;                 //存放接收来的数据    
    int itemp;                      //临时计数变量
    UART_MemMapPtr  sci_ptr = UART4_BASE_PTR;  //串口4基地址
    //若无数据，转退出（用goto语句向后转，保证单出口）
    if ((sci_ptr->S1 & UART_S1_RDRF_MASK)==0) goto UART4_RX_ISR_End;
   
    Redata  = sci_ptr->D;    //接收的一个字节数据
    sci_ptr->D = Redata;     //将收到的一个字节数据发送回去
  
    //组帧成功,置”串口4接收完整数据帧事件位“
    if(CreateFrame(Redata)!=0)  
    {
        _lwevent_set(&lwevent_group1,Event_UART4_ReData); 
    }
UART4_RX_ISR_End: ;
}

//内部调用函数

//===========================================================================
//ISR名称：Createg_UART_ISR_buffer
//功能概要：组建数据帧，将待组帧数据加入到数据帧中
//参数说明：Data：                  待组帧数据
//函数返回：组帧状态  0-组帧未成功，1-组帧成功
//备          注：十六进制数据帧格式 
//             帧头         + 数据长度 + 有效数据  +   帧尾                
//          FrameHead +   len   + 有效数据  + FrameTail
//===========================================================================
uint8_t CreateFrame(uint8_t Data)
{
    static uint8_t frameCount=0;    //组帧计数器
    static uint8_t frameFlag=0;     //组帧状态
    //根据静态变量frameCount组帧
    switch(frameCount)
    {
        case 0:    //第一个数据
        {
            if (Data==FrameHead)    //收到数据是帧头FrameHead
            {
                g_UART_ISR_buffer[0]=Data;    
                frameCount++;
                frameFlag=0;      //组帧开始
            }
            break;
        }
        case 1:    //第二个数据，该数据是随后接收的数据个数
        {
            g_UART_ISR_buffer[1]=Data;  
            frameCount++;
            break;
        }
        default:    //其他情况
        {                
            //第二位数据是有效数据长度,根据它接收余下的数据直到帧尾前一位
            if(frameCount>=2 && frameCount<=(g_UART_ISR_buffer[1] + 1))        
            {
                g_UART_ISR_buffer[frameCount]=Data;  
                frameCount++;
                break;
            }
                    
            //若是末尾数据则执行
            if(frameCount>=(g_UART_ISR_buffer[1]+2))
            {
               if (Data==FrameTail)    //若是帧尾
                {
                    g_UART_ISR_buffer[frameCount]=Data;   //将帧尾0x44存入缓冲区
                    frameCount=0;   //接收数据个数清0,可以开始重新组帧
                    frameFlag=1;    //组帧成功
                }
                else                //若不是帧尾
                { 
                    frameCount=0;   //组帧失败，计数清0，准备重新组帧
                }
                break;
            }         
        }
    }   //switch_END
    return frameFlag;               //返回组帧状态
}




