下面是主函数,Netif_Config();中的位置能够快速联网,PC作为服务器,F407作为客户端,但是无法接收返回的数据,过一会后网络断开。如果把Netif_Config()放在主函数的最后一句,收发数据正常,但是联网过程很慢,需要较长时间。
int main(void)
{
HAL_Init();
SystemClock_Config(); //系统时钟初始化
Netif_Config();
MX_TIM3_Init(); //产生1ms中断延时,为了定时,当作定时器使用
HAL_TIM_Base_Start_IT(&htim3); //以中断方式打开定时器3
MX_GPIO_Init(); //用到的GPIO口的初始化,含红外开关传感器1-2,抱紧程度3-4
KEY_GPIO_Init(); //5个专门按键的初始化
// MX_IWDG_Init(IWDG_PRESCALER_128,1250); //在4s钟内喂狗,不会复位。超过4秒钟没有喂狗,则复位。
// __HAL_IWDG_START(&hiwdg); //为了防止RF200的读卡器卡死,若卡死,则自动重启系统。
//MX_TIM4_Init(); //使用定时器4产生脉冲驱动转向电机2(左后),王兰对电机进行编号
//MX_TIM6_Init();
MX_TIM8_Init(); //2S57--4路转向。定时器8,是一个定时器产生4路脉冲,去控制4路步进电机。高级控制定时器初始化并配置PWM输出功能,转向电机的驱动器2S57定时器的初始化
//MX_TIM10_Init(); //使用定时器10产生脉冲驱动转向电机1(左前),王兰对电机进行编号
//MX_TIM11_Init(); //使用定时器11产生脉冲驱动转向电机3(右前),王兰对电机进行编号
//MX_TIM13_Init(); //使用定时器13产生脉冲驱动转向电机4(右后),王兰对电机进行编号
MX_USART1_UART_Init(); //与轮毂电机进行UART或者485通信+printf打印输出
// MX_USART2_UART_Init(); //与RFID相连
// HAL_UART_Receive_IT(&huart2,&USART2_Rxtemp,1); //当接收到Size大小的字节后就产生一次中断进入中断处理
MX_USART6_UART_Init(); //采集陀螺仪数据。串口通信
HAL_UART_Receive_IT(&huart6,&USART6_Rxtemp,1); //接收陀螺仪数据信息
// HAL_UART_Transmit(&huart2,MultiInventCMD,10,400);//发送命令控制RFID阅读器MultiInventCMD
HAL_Delay(500);
for(int k=0;k<2;k++)
{
printf("Send_15_dBm--%d\r\n",HAL_UART_Transmit(&huart2,Send_15_dBm,9,400));
HAL_Delay(500);
}
HAL_TIM_Base_Start(&htimx_STEPMOTOR);/* 确定定时器TIM8--4路2S57,转向电机*/
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,STEPMOTOR_NO1_TIM_CHANNEL_x);/*使能中断。关闭比较输出*/
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,STEPMOTOR_NO2_TIM_CHANNEL_x);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,STEPMOTOR_NO3_TIM_CHANNEL_x);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,STEPMOTOR_NO4_TIM_CHANNEL_x);
TIM_CCxChannelCmd(STEPMOTOR_TIMx,STEPMOTOR_NO1_TIM_CHANNEL_x,TIM_CCx_DISABLE);
TIM_CCxChannelCmd(STEPMOTOR_TIMx,STEPMOTOR_NO2_TIM_CHANNEL_x,TIM_CCx_DISABLE);
TIM_CCxChannelCmd(STEPMOTOR_TIMx,STEPMOTOR_NO3_TIM_CHANNEL_x,TIM_CCx_DISABLE);
TIM_CCxChannelCmd(STEPMOTOR_TIMx,STEPMOTOR_NO4_TIM_CHANNEL_x,TIM_CCx_DISABLE);
RS485_USARTx_Init();//Modbus使用RS485初始化 USART3--9600,控制横抱+抬升电机
MB_WriteHoldingReg_06H(0x02, 0x8000, 0x0A02);//提升电机为02号地址,停止。
HAL_Delay(100);
MB_WriteHoldingReg_06H(0x01, 0x8000, 0x0A02);//停止横抱电机
HAL_Delay(100); //02 06 80 02 17 01 CF C9
find_zero(); //让机器人寻找原点,转向电机,将轮子方向统一一致,轮子一个一个调整转向
MX_CAN1_Init(); //电路板上的CAN口,控制L2DB,从而控制轮毂电机,CAN通信方式
can_filter_init();
HAL_CAN_Start(&hcan1); //开启CAN总开关
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);//启动CAN接收中断
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET);
#if PID_ASSISTANT_EN
int Temp = pid.target_val; // 上位机需要整数参数,转换一下
set_computer_value(SEED_START_CMD, CURVES_CH1, NULL, 0);// 同步上位机的启动按钮状态
set_computer_value(SEED_TARGET_CMD, CURVES_CH1, &Temp, 1);// 给通道 1 发送目标值
#endif
MX_AD7190_SPI_Init(); //使用SPI总线接AD7190,连接超声传感器测距,2路测距
if(AD7190_Init()==0) //初始化AD7190检测通信状态
{
printf("获取不到 AD7190!\n");
while(1)
{
HAL_Delay(1000);
if(AD7190_Init())
{
printf("第2次获取到 AD7190!\n");
break;
}
}
}
ad7190_unipolar_conf(); //AD7190四路单端采集配置,屏蔽掉后可以TCP连接,但是延时
解决方法是:放在下面这个位置,就可以正常联网和收发数据,原因还没有查出来。
MX_AD7190_SPI_Init(); //使用SPI总线接AD7190,连接超声传感器测距,2路测距
//HAL_Delay(1000);HAL_Delay(1000);HAL_Delay(1000);HAL_Delay(1000);
Netif_Config();
if(AD7190_Init()==0) //初始化AD7190检测通信状态
{
printf("获取不到 AD7190!\n");
while(1)
{
HAL_Delay(1000);
if(AD7190_Init())
{
printf("第2次获取到 AD7190!\n");
break;
}
}
}
ad7190_unipolar_conf(); //AD7190四路单端采集配置,屏蔽掉后可以TCP连接,但是延时