//查询是否有接收数据,并进行处理。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; }