HalRecv_tpye1.c 5.0 KB
/*********************************
 * 
 *  极至接收数据处理
 *  数据类型1
 *      用于串口协议,大疆多通道接收协议
 * 
 * ****************************************/

#include <stdio.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"

/***************
 * 
 * 
 *   极至串口协议的数据初步筛选
 *   用于清空无效数据
 *   以及将有效数据提取出来,放置到后续处理函数中
 *   输入要 处理的原始数据data 以及 数据长度DataLen 还有输入的接口 
 *   返回值:未处理的长度数据
 * 
 *   返回后在
 * ********************/
int HalRecv_tpye1_PreliminaryScreeningOfData(unsigned char *Data, unsigned int DataLen, int Port)
{
    int ResidualLength = 0; //  剩余数据长度

    switch (Port)
    {
        case UART_DEV_1:
            //JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", DataLen);
        break;

        case UART_DEV_2:
            //JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", DataLen);
        break;

        case UART_4G:
            //JZSDK_LOG_INFO("串口-4G模块,接受到数据+未处理数据的长度len: %d", DataLen);
        break;

        case HAL_DATA_TRANSMISSION:
            //JZSDK_LOG_INFO("hal-数据传输,接受到数据+未处理数据的长度len: %d", DataLen);
        break;
    
        /********** 未报备的接口 ************/
        default:
            ResidualLength = 0;
            return ResidualLength;
        break;
    }

    //确保有数据传输进来
    if (DataLen <= 0)
    {
        ResidualLength = 0;
        return ResidualLength;
    }

    int HaveReadLen = 0; // 已读长度
	int HaveDealLen = 0; // 已处理长度
	int FrameFlag = 0x00;	 // 帧标志
	int FrameLen = 0;

    //将数据提取出来
    for (HaveReadLen = 0; HaveReadLen <= (DataLen - 3); )
    {
        //查找是否存在 帧头
        switch (Data[HaveReadLen])
        {
            case 0x5A:
            {
                if (Data[HaveReadLen + 1] == 0x5A && Data[HaveReadLen + 2] == 0x77) 
                {
                    FrameFlag = 0x5A;
                }
                else
                {
                    FrameFlag = 0x00;    
                }
                break;
            }

            case 0x5B:
            {
                if (Data[HaveReadLen + 1] == 0x5B && Data[HaveReadLen + 2] == 0x77) 
                {
                    FrameFlag = 0x5B;
                }
                else
                {
                    FrameFlag = 0x00;    
                }
                break;
            }

            case 0x6A:
            {
                if (Data[HaveReadLen + 1] == 0x6A && Data[HaveReadLen + 2] == 0x77) 
                {
                    FrameFlag = 0x6A;
                }
                else
                {
                    FrameFlag = 0x00;    
                }
                break;
            }

            case 0x6B:
            {
                if (Data[HaveReadLen + 1] == 0x6B && Data[HaveReadLen + 2] == 0x77) 
                {
                    FrameFlag = 0x6B;
                }
                else
                {
                    FrameFlag = 0x00;
                }
            }
        
            default:
                FrameFlag = 0x00;
            break;
        }

        if (FrameFlag == 0x00)
        {
            if (HaveReadLen >= (DataLen - 5))
			{
				//JZSDK_LOG_INFO("没有找到帧头");
			}	
			HaveReadLen++;
			continue;
        }

        //如果有帧头,则先判断前面有没有多余的数据残留,并将其移除
        if (HaveReadLen > HaveDealLen)
        {
            //JZSDK_LOG_INFO("残余处理%d",(HaveReadLen - HaveDealLen));
            HaveDealLen = HaveReadLen;
        }
        
        //检查帧长度是否超出数据剩余的内容
        FrameLen = (((int)Data[HaveReadLen+3]) << 8) + (int)Data[HaveReadLen+4];
        if (FrameLen > (DataLen - HaveReadLen))
        {
            //JZSDK_LOG_DEBUG("当前帧长度位长度%d 超出剩余帧长度%d ",FrameLen,(getbufLen - HaveReadLen));
			// 直接跳出for循环
			break;
        }
        
		//检查帧长度是否为0,避免卡死接收串口
		if (FrameLen == 0)
		{
			JZSDK_LOG_ERROR("严重错误,接收到的帧出现长度为空");
			//直接清空接收的数组
			return 0;
		}

        //以上检查都没问题,则正常输出帧
		//JZSDK_LOG_INFO("正常输出帧%d",FrameLen);

		//UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveReadLen], FrameLen);
		HaveReadLen = HaveReadLen + FrameLen;	
		HaveDealLen = HaveReadLen;

		JZSDK_LOG_INFO("Prot:%x f_len%d h_r%d [h_r]:%x get%d",Port,FrameLen ,HaveReadLen, getbuf[HaveReadLen-1], DataLen);

		FrameLen = 0;
		FrameFlag = 0;
    }
    
	// 如果没有数据残留了
	if (HaveDealLen >= DataLen) 
	{
		//printf("HaveReadLen:%d HaveDealLen%d getbufLen:%d\n",HaveReadLen,HaveDealLen,getbufLen);
        ResidualLength = 0;
        return ResidualLength;
	}

    else
    {
        
    }

    return ResidualLength;
}


static T_JZsdkReturnCode