Example #1
0
//查询是否有接收数据,并进行处理。rebuf 为可供使用的缓冲区
//
nrf_result_e nrf_msg_rx(com_e  *com, uint8 *rebuf)
{
    com_e   comtmp;
    uint32  len;
    uint32  tmplen;
    uint32  relen;                              //接收到的数据长度
    uint8   *buftemp;

    uint32  totallen ;                          //总需要接收包的数目(包的整数倍)
    uint16  tmpcheck;

RE_LOOP:
    buftemp = rebuf;                            //加载起始地址

    relen = nrf_rx(buftemp, DATA_PACKET);       //接收 第一个包
    if(relen == 0)
    {
        //如果是 预校验 失败,那么 肯定可以接收到数据,不会进入此处

        //只有 一开始 进入函数 第一次接收的时候,才出现接收失败

        return NRF_RESULT_RX_NO;                //没接收到数据
    }

    comtmp = (com_e)buftemp[0];
    if(((uint8)comtmp < (uint8)COM_MAX) && (buftemp[1] ==  (uint8)~comtmp) && (comtmp != COM_RETRAN) )
    {
        //校验正确,继续接收剩余 的数据

        totallen = nrf_com_totalsize[comtmp];   //总接收参数

        if(totallen > relen )                   //数据长度 超过 已接收长度
        {
            //需要继续接收
            len = totallen - relen;             //剩余接收的 长度

            //等待接收FIFO里的数据校验正确才接收
            while( !nrf_rx_fifo_check(nrf_com_size[comtmp] + 2 * COM_LEN - relen,&tmpcheck)  );   //等待接收
            if( tmpcheck !=  (uint16)((uint8)~comtmp + (comtmp<<8)))
            {
                goto RE_LOOP;                   //校验失败 ,放弃刚才接收的 第一个 包 (重新接收数据)
            }

            tmplen = relen;
            do
            {
                buftemp += tmplen;              //移动到尚未接收数据的缓冲区
                tmplen = nrf_rx(buftemp, len);  //接收数据
                //relen += tmplen;
                len -= tmplen;
            }
            while(len);
        }

        //校验尾部数据是否正确
        if(
            (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 2] ==   (uint8)~comtmp)
            &&  (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 1] ==   (uint8) comtmp)   )
        {
            *com = comtmp;                          //存储命令

            //对 命令 数据进行 处理
            switch(*com)
            {
            case COM_VAR:
                last_tab = *((uint32 *)&rebuf[COM_LEN]);                                    //读取变量编号
                if(last_tab < VAR_MAX)
                {
                    save_var((var_tab_e)last_tab, *((uint32 *)&rebuf[COM_LEN + sizeof(uint32)]));          //存储 变量
                    var_display(last_tab);                                                  //显示 变量
                }
                else
                {
                    return NRF_RESULT_RX_NOVALID;
                }
                break;
            default:
                break;
            }

            return NRF_RESULT_RX_VALID;             //接收有效数据
        }
    }

    //有接收到数据,但接收数据无效
    return NRF_RESULT_RX_NOVALID;
}
//查询是否有接收数据,并进行处理。rebuf 为可供使用的缓冲区
//
nrf_result_e nrf_msg_rx(com_e  *com, uint8 *rebuf)
{
    com_e   comtmp;
    uint32  len;
    uint32  tmplen;
    uint32  relen;                              //接收到的数据长度
    uint8   *buftemp;
    uint32  tmp;
    uint32  totallen ;                          //总需要接收包的数目(包的整数倍)
    uint16  tmpcheck;

RE_LOOP:
    buftemp = rebuf;                            //加载起始地址

    relen = nrf_rx(buftemp, DATA_PACKET);       //接收 第一个包
    if(relen == 0)
    {
        //如果是 预校验 失败,那么 肯定可以接收到数据,不会进入此处

        //只有 一开始 进入函数 第一次接收的时候,才出现接收失败

        return NRF_RESULT_RX_NO;                //没接收到数据
    }

    comtmp = (com_e)buftemp[0];
    if(((uint8)comtmp < (uint8)COM_MAX) && (buftemp[1] ==  (uint8)~comtmp) && (comtmp != COM_RETRAN) )
    {
        //校验正确,继续接收剩余 的数据

        totallen = nrf_com_totalsize[comtmp];   //总接收参数

        if(totallen > relen )                   //数据长度 超过 已接收长度
        {
            //需要继续接收
            len = totallen - relen;             //剩余接收的 长度

            //等待接收FIFO里的数据校验正确才接收
            while( !nrf_rx_fifo_check(nrf_com_size[comtmp] + 2 * COM_LEN - relen,&tmpcheck)  );   //等待接收
            if( tmpcheck !=  (uint16)((uint8)~comtmp + (comtmp<<8)))
            {
                goto RE_LOOP;                   //校验失败 ,放弃刚才接收的 第一个 包 (重新接收数据)
            }

            tmplen = relen;
            do
            {
                buftemp += tmplen;              //移动到尚未接收数据的缓冲区
                tmplen = nrf_rx(buftemp, len);  //接收数据
                //relen += tmplen;
                len -= tmplen;
            }
            while(len);
        }

        //校验尾部数据是否正确
        if(
            (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 2] ==   (uint8)~comtmp)
            &&  (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 1] ==   (uint8) comtmp)   )
        {
            *com = comtmp;                          //存储命令

            //对 命令 数据进行 处理
            switch(*com)
            {
			case COM_ADC:
				struct FLAdc_s * adc = &Nrf_Adc;
				for (uint8 i = 0; i<sizeof(struct FLAdc_s); i++)
				{
					*((uint8 *)adc + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Mpid:
				struct Pid_s * mpid = &Nrf_MPid;
				for (uint8 i = 0; i < sizeof(struct Pid_s); i++)
				{
					*((uint8 *)mpid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Spid:
				struct Pid_s * spid = &Nrf_SPid;
				for (uint8 i = 0; i < sizeof(struct Pid_s); i++)
				{
					*((uint8 *)spid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Speed:
				struct MotorSpeed_s * speed = &Nrf_Speed;
				for (uint8 i = 0; i < sizeof(struct MotorSpeed_s); i++)
				{
					*((uint8 *)spid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_TEST:
#ifdef DEBUG
				printf("I got Test Command!\n");
#endif // DEBUG
				break;

			case COM_Ctrl:
				CarCtrl((Ctrl_e)rebuf[COM_LEN]);
				break;

            default:
				ASSERT(true);
                break;
            }

            return NRF_RESULT_RX_VALID;             //接收有效数据
        }
    }

    //有接收到数据,但接收数据无效
    return NRF_RESULT_RX_NOVALID;
}