uint8 NrfRecStrCheck(uint8 * str, uint8 retryTime) { uint8 relen = 0; while (retryTime--) { relen = nrf_rx(str, DATA_PACKET); if (relen != 0) { return relen; } } return relen; }
int main (void) { unsigned char AP; unsigned char i = 0,bit; flag = RX; AP = 0; //若为第一个节点则AP = 0,第二个节点AP = 1 if (AP == 1) { for (i = 0; i< TX_ADR_WIDTH; i++) { TX_ADDRESS[i] = TX_AP0[i]; } } init_uart (BAUD_SETTING); stdout = &mystdout; SPI_Init (); for (i = 0; i < 32; i++) { tx_buf[i] = 0xff; } while (1) { if (flag==RX) { bit = nrf_rx (TX_ADDRESS); if (bit) { printf ("the data are: \n"); for (i = 0; i < 32; i++) { printf ("%4d", rx_buf[i]); rx_buf[i] = '\0'; if ((i+1) % 10 == 0) printf ("\n"); } printf ("\n"); } else printf ("the data error\n"); } else { nrf_tx (TX_ADDRESS); } _delay_ms (1000); } }
//查询是否有接收数据,并进行处理。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; }
/*! * @brief main函数 * @since v5.0 * @note 测试 LED 功能是否正常 看到的效果是LED0和LED1同时亮灭闪烁 */ void main() { uint8 buff[DATA_PACKET]; int relen = 0, i; //====================================================== //NRF Init Init_NRF(); PIDSetting _pidsettings[PIDSETTING_NUM]; DIYParameter _diyparameter[DIYPARAMETER_NUM]; WholeSetting _wholesettings[GLOBAL_SETTING_NUM]; for(i = 0; i < PIDSETTING_NUM; ++i) { _pidsettings[i].father = 0; _pidsettings[i].child = 0; _pidsettings[i].Value_P = 0; _pidsettings[i].Value_I = 0; _pidsettings[i].Value_D = 0; } for(i = 0; i < DIYPARAMETER_NUM; ++i) { _diyparameter[i].father = 0; _diyparameter[i].child = 0; _diyparameter[i].DIY_Value = 0; } for(i = 0; i < GLOBAL_SETTING_NUM; ++i) { _wholesettings[i].father = 0; _wholesettings[i].child = 0; _wholesettings[i].need_Send = 0; } //NRF_Init End // led_init(LED1); //初始化LED1 while(1) { //FOR RECEIVE relen = nrf_rx(buff,DATA_PACKET); //等待接收一个数据包,数据存储在buff里 if(relen != 0) { NRF_Recieve(buff, _pidsettings, PIDSETTING_NUM, _diyparameter, DIYPARAMETER_NUM, _wholesettings, GLOBAL_SETTING_NUM); // //在这里设置接收到的设置参数(PID和DIY参数) // //======================================================== // //舵机 // if(_pidsettings[0].FlagValueChanged == 1) // { // /*在这里输入你的变量名——下同*/ // SPEED_CONTROL_P = _pidsettings[0].Value_P; // SPEED_CONTROL_I = _pidsettings[0].Value_I; // SPEED_CONTROL_D = _pidsettings[0].Value_D; // _pidsettings[0].FlagValueChanged = 0; // SendPack_Echo(SendBackPID_ACK, Servo_ACK, "ACK"); // } // //======================================================== // //非直立的电机 // if(_pidsettings[1].FlagValueChanged == 1) // { // ANGLE_CONTROL_P = _pidsettings[1].Value_P; // ANGLE_CONTROL_I = _pidsettings[1].Value_I; // ANGLE_CONTROL_D = _pidsettings[1].Value_D; // _pidsettings[1].FlagValueChanged = 0; // SendPack_Echo(SendBackPID_ACK, Nonbalance_Motor_ACK, "ACK"); // } // //======================================================== // //角度 // if(_pidsettings[2].FlagValueChanged == 1) // { // ANGLE_CONTROL_P = _pidsettings[2].Value_P; // //ANGLE_CONTROL_I = _pidsettings[2].Value_I; // ANGLE_CONTROL_D = _pidsettings[2].Value_D; // _pidsettings[2].FlagValueChanged = 0; // SendPack_Echo(SendBackPID_ACK, Balance_Stand_ACK, "ACK"); // } // //======================================================== // //速度 // if(_pidsettings[3].FlagValueChanged == 1) // { // SPEED_CONTROL_P = _pidsettings[3].Value_P; // SPEED_CONTROL_I = _pidsettings[3].Value_I; // SPEED_CONTROL_D = _pidsettings[3].Value_D; // //// //参数 //// g_fSpeedControlOut = 0; //// g_fSpeedControlOutNew = 0; //// g_fSpeedControlOutOld = 0; //// fsampleerror1 = 0; // _pidsettings[3].FlagValueChanged = 0; // SendPack_Echo(SendBackPID_ACK, Balance_Speed_ACK, "ACK"); // // printf("recvi!"); // } // //======================================================== // //方向 // if(_pidsettings[4].FlagValueChanged == 1) // { // DIRECTION_CONTROL_P = _pidsettings[4].Value_P; // //DIRECTION_CONTROL_I = _pidsettings[4].Value_I; // DIRECTION_CONTROL_D = _pidsettings[4].Value_D; // _pidsettings[4].FlagValueChanged = 0; // SendPack_Echo(SendBackPID_ACK, Balance_Direction_ACK, "ACK"); // } // ////////////////////////////////////////////////////////// // //自定义参数一 // if (_diyparameter[0].FlagValueChanged == 1) // { // CAR_SPEED_SET = _diyparameter[0].DIY_Value; // _diyparameter[0].FlagValueChanged = 0; // SendPack_Echo(SendBackDIY_ACK, DIY_Para_1_ACK, "ACK"); // } // //======================================================= // //自定义参数二 // if (_diyparameter[1].FlagValueChanged == 1) // { // //diyTest = _diyparameter[1].DIY_Value; // //_diyparameter[1].FlagValueChanged = 0; // //SendPack_Echo(SendBackDIY_ACK, DIY_Para_2_ACK, "ACK"); // } // //======================================================= // //======================================== //对于获取下位机参数的响应,写需要回发的变量类型 if(_wholesettings[0].need_Send == 1) { printf("I will send\n"); //**************************************** //PID参数回发 //SendPack_PID(SendBackPID, Balance_Stand, ANGLE_CONTROL_P, 0, ANGLE_CONTROL_D, 1, 1); //直立PID SendPack_PID(SendBackPID, Balance_Speed, SPEED_CONTROL_P, SPEED_CONTROL_I, SPEED_CONTROL_D, 1, 1); //速度PID //SendPack_PID(SendBackPID, Balance_Direction, DIRECTION_CONTROL_P, 0, DIRECTION_CONTROL_D, 1, 1); //方向PID //**************************************** //自定义参数 SendPack_Short(SendBackDIY,DIY_Para_1, 10, 1, 1); SendPack_Short(SendBackDIY,DIY_Para_2, 100, 1, 1); SendPack_Short(SendBackDIY,DIY_Para_3, 10.2, 1, 1); _wholesettings[0].need_Send = 0; } //======================================================== //======================================================== //紧急停车!!!!!!!!!!! if(_wholesettings[1].need_Send == 1) { //关闭需要关闭的中断 //disable_irq(PORTE_IRQn); // //关闭输出 // ftm_pwm_duty(FTM0, FTM_CH0, 1000); // ftm_pwm_duty(FTM0, FTM_CH1, 1000); // ftm_pwm_duty(FTM0, FTM_CH2, 1000); // ftm_pwm_duty(FTM0, FTM_CH3, 1000); SendPack_Echo(9, 1, "ACK"); } //======================================================== } //======================================================= //参数发送区域 //======================================================= //摄像头图像 //SendPack_Camera(Camera, Camera_1, imgbuff, CAMERA_SIZE); //**************************************** //CCD图像 //SendPack_CCD(2, 1, (uint8_t *)&CCD_BUFF[0], TSL1401_SIZE, 1, 1); //**************************************** //实时参数 //SendPack_Short(Electricity,Electricity_1, /*你的变量名*/ 0, 1, 0); //**************************************** //实时参数 SendPack_Short(RealTime,RealTime_1, (int)1, 1, 1); SendPack_Short(RealTime,RealTime_2, (int)2, 1, 1); SendPack_Short(RealTime,RealTime_3, (int)22, 1, 1); SendPack_Short(RealTime,RealTime_4, (int)33, 1, 1); SendPack_Short(RealTime,RealTime_5, (int)45, 1, 1); SendPack_Short(RealTime,RealTime_6, (int)33, 1, 1); //**************************************** //======================================== DELAY_MS(10); } }