STM32F407+LAN8720A +LWIP +FreeRTOS UDP通讯

[复制链接]
发表于 2025-12-7 20:01:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
STM32F407+LAN8720A +LWIP +FreeRTOS ping通
上一篇实现了LWIP ping 通
本篇实现UDP通讯

实现如下功能:
      
  • 串口1空闲停止+DMA吸取,收到数据用UDP发送  
  • UDP吸取,收到数据用串口1发送
STM32CUBEIDE设置和代码

1. 设置UARAT1的空闲停止+DMA吸取


UART1吸取到数据,开释信号量,在使命中举行数据处置惩罚(UDP发送)
  1. /* USER CODE END Header_StartTask03 */
  2. void StartTask03(void const * argument)
  3. {
  4.    
  5.    
  6.   /* USER CODE BEGIN StartTask03 */
  7.         uint16_t len_data;
  8.         HAL_UARTEx_ReceiveToIdle_DMA(&huart1, buletooth_rxBuf, 250);
  9.         hdma_usart1_rx.Instance->CR  &= ~(DMA_IT_HT);//取消接收一半中断
  10.   /* Infinite loop */
  11.   for(;;)
  12.   {
  13.    
  14.    
  15.           //UART RECEIVED, UDP SEND
  16.           osSemaphoreWait (BinarySem_BLUE_RecHandle, osWaitForever);
  17.           if(ble_rxBuf_len > 0)
  18.           {
  19.    
  20.    
  21.                   len_data = ble_rxBuf_len;
  22.                   udp_client_send_data(buletooth_rxBuf, len_data);
  23.           }
  24.   }
  25.   /* USER CODE END StartTask03 */
  26. }
  27. /* Private application code --------------------------------------------------*/
  28. /* USER CODE BEGIN Application */
  29. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
  30. {
  31.    
  32.    
  33.         if(huart->Instance ==  USART1)
  34.         {
  35.    
  36.    
  37.                 ble_rxBuf_len = Size;
  38.                 osSemaphoreRelease (BinarySem_BLUE_RecHandle);
  39.                 HAL_UARTEx_ReceiveToIdle_DMA(&huart1, buletooth_rxBuf, 250);
  40.         }
  41. }
复制代码
2. 设置UDP

  1. void udp_client_init(void)
  2. {
  3.    
  4.    
  5.         ip_addr_t serverIP;
  6.         err_t err;
  7.         IP4_ADDR(&serverIP, 192, 168, 111, 11);
  8.     upcb = udp_new();
  9.     if (upcb != NULL)
  10.     {
  11.    
  12.    
  13.         /* 配置本地端口 */
  14.         upcb->local_port = UDP_LOCAL_PORT;
  15.         /* 配置服务器IP和端口号*/
  16.         err = udp_connect(upcb, &serverIP, UDP_REMOTE_PORT);
  17.         if (err == ERR_OK)
  18.         {
  19.    
  20.    
  21.             /* 注册接收回调函数 */
  22.             udp_recv(upcb, udp_receive_callback, NULL);
  23.             printf("UDP INIT SUCCESS\r\n");
  24.         }
  25.         else
  26.         {
  27.    
  28.    
  29.             udp_remove(upcb);
  30.         }
  31.     }
  32. }
  33. static void udp_receive_callback(void *arg, struct udp_pcb *upcb,struct pbuf *p, const ip_addr_t *addr, u16_t port)
  34. {
  35.    
  36.    
  37.     if (p != NULL)
  38.     {
  39.    
  40.    
  41.         struct pbuf *ptmp = p;
  42.         while (ptmp != NULL)
  43.         {
  44.    
  45.    
  46.             memset(cache_udprece, 0, sizeof(cache_udprece));
  47.             memcp
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表