我是卓波,很高興你來看我的博客。
系列文章:
stm32+lwip(一):使用STM32CubeMX生成項目
ST官方有lwip的例程,下載地址如下:
本文例子參考ST官方給出的例程。
一、准備
ST例程文檔關於lwip的介紹如下:
由此可以看到LWIP有三種API,在本文中,使用Raw API。
本文用到的UDP Raw API如下:
二、udp client
1 /** 2 ***************************************************************************** 3 * @file udp_client.c 4 * @author Zorb 5 * @version V1.0.0 6 * @date 2018-09-04 7 * @brief udp客戶端的實現 8 ***************************************************************************** 9 * @history 10 * 11 * 1. Date:2018-09-04 12 * Author:Zorb 13 * Modification:建立文件 14 * 15 ***************************************************************************** 16 */ 17 18 #include "stm32f4xx_hal.h" 19 #include "lwip.h" 20 #include "udp.h" 21 #include "string.h" 22 23 /* 定義端口號 */ 24 #define UDP_REMOTE_PORT 8881 /* 遠端端口 */ 25 #define UDP_LOCAL_PORT 8880 /* 本地端口 */ 26 27 /* udp控制塊 */ 28 static struct udp_pcb *upcb; 29 30 /****************************************************************************** 31 * 描述 : 接收回調函數 32 * 參數 : - 33 * 返回 : 無 34 ******************************************************************************/ 35 static void udp_receive_callback(void *arg, struct udp_pcb *upcb, 36 struct pbuf *p, const ip_addr_t *addr, u16_t port) 37 { 38 uint32_t i; 39 40 /* 數據回傳 */ 41 // udp_send(upcb, p); 42 // udp_sendto(upcb, p, addr, port); 43 44 /* 打印接收到的數據 */ 45 printf("get msg from %d:%d:%d:%d port:%d:\r\n", 46 *((uint8_t *)&addr->addr), *((uint8_t *)&addr->addr + 1), 47 *((uint8_t *)&addr->addr + 2), *((uint8_t *)&addr->addr + 3), port); 48 49 if (p != NULL) 50 { 51 struct pbuf *ptmp = p; 52 53 while(ptmp != NULL) 54 { 55 for (i = 0; i < p->len; i++) 56 { 57 printf("%c", *((char *)p->payload + i)); 58 } 59 60 ptmp = p->next; 61 } 62 63 printf("\r\n"); 64 } 65 66 /* 釋放緩沖區數據 */ 67 pbuf_free(p); 68 } 69 70 /****************************************************************************** 71 * 描述 : 發送udp數據 72 * 參數 : (in)pData 發送數據的指針 73 * 返回 : 無 74 ******************************************************************************/ 75 void udp_client_send(char *pData) 76 { 77 struct pbuf *p; 78 79 /* 分配緩沖區空間 */ 80 p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL); 81 82 if (p != NULL) 83 { 84 /* 填充緩沖區數據 */ 85 pbuf_take(p, pData, strlen(pData)); 86 87 /* 發送udp數據 */ 88 udp_send(upcb, p); 89 90 /* 釋放緩沖區空間 */ 91 pbuf_free(p); 92 } 93 } 94 95 /****************************************************************************** 96 * 描述 : 創建udp客戶端 97 * 參數 : 無 98 * 返回 : 無 99 ******************************************************************************/ 100 void udp_client_init(void) 101 { 102 ip_addr_t serverIP; 103 err_t err; 104 105 IP4_ADDR(&serverIP, 192, 168, 2, 194); 106 107 /* 創建udp控制塊 */ 108 upcb = udp_new(); 109 110 if (upcb!=NULL) 111 { 112 /* 配置本地端口 */ 113 upcb->local_port = UDP_LOCAL_PORT; 114 115 /* 配置服務器IP和端口 */ 116 err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT); 117 118 if (err == ERR_OK) 119 { 120 /* 注冊接收回調函數 */ 121 udp_recv(upcb, udp_receive_callback, NULL); 122 123 /* 發送udp數據 */ 124 udp_client_send("udp client connected"); 125 126 printf("udp client connected\r\n"); 127 } 128 else 129 { 130 udp_remove(upcb); 131 132 printf("can not connect udp pcb\r\n"); 133 } 134 } 135 } 136 137 /******************************** END OF FILE ********************************/
本例用到的上位機IP為192.168.2.194,開放端口為8881
STM32的IP為192.168.2.8,開放端口為8880
先將網絡調試助手的UDP連接打開,然后給STM32上電。
網絡調試助手將會收到如下信息:
然后點擊網絡調試助手的發送,STM32調試串口輸出以下信息:
get msg from 192:168:2:194 port:8881: hello zorb
三、udp server
1 /** 2 ***************************************************************************** 3 * @file udp_server.c 4 * @author Zorb 5 * @version V1.0.0 6 * @date 2018-09-04 7 * @brief udp服務端的實現 8 ***************************************************************************** 9 * @history 10 * 11 * 1. Date:2018-09-04 12 * Author:Zorb 13 * Modification:建立文件 14 * 15 ***************************************************************************** 16 */ 17 18 #include "stm32f4xx_hal.h" 19 #include "lwip.h" 20 #include "udp.h" 21 22 /* 定義端口號 */ 23 #define UDP_REMOTE_PORT 8881 /* 遠端端口 */ 24 #define UDP_LOCAL_PORT 8880 /* 本地端口 */ 25 26 /****************************************************************************** 27 * 描述 : 接收回調函數 28 * 參數 : - 29 * 返回 : 無 30 ******************************************************************************/ 31 static void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, 32 struct pbuf *p, const ip_addr_t *addr, u16_t port) 33 { 34 uint32_t i; 35 36 /* 數據回傳 */ 37 // udp_sendto(upcb, p, addr, port); 38 39 /* 打印接收到的數據 */ 40 printf("get msg from %d:%d:%d:%d port:%d:\r\n", 41 *((uint8_t *)&addr->addr), *((uint8_t *)&addr->addr + 1), 42 *((uint8_t *)&addr->addr + 2), *((uint8_t *)&addr->addr + 3), port); 43 44 if (p != NULL) 45 { 46 struct pbuf *ptmp = p; 47 48 while(ptmp != NULL) 49 { 50 for (i = 0; i < p->len; i++) 51 { 52 printf("%c", *((char *)p->payload + i)); 53 } 54 55 ptmp = p->next; 56 } 57 58 59 printf("\r\n"); 60 } 61 62 /* 釋放緩沖區數據 */ 63 pbuf_free(p); 64 } 65 66 /****************************************************************************** 67 * 描述 : 初始化UDP服務器端 68 * 參數 : 無 69 * 返回 : 無 70 ******************************************************************************/ 71 void udp_server_init(void) 72 { 73 struct udp_pcb *upcb; 74 err_t err; 75 76 /* 創建udp控制塊 */ 77 upcb = udp_new(); 78 79 if (upcb) 80 { 81 /* 綁定端口接收,接收對象為所有ip地址 */ 82 err = udp_bind(upcb, IP_ADDR_ANY, UDP_LOCAL_PORT); 83 84 if(err == ERR_OK) 85 { 86 /* 注冊接收回調函數 */ 87 udp_recv(upcb, udp_server_receive_callback, NULL); 88 } 89 else 90 { 91 /* 刪除控制塊 */ 92 udp_remove(upcb); 93 94 printf("can not bind pcb\r\n"); 95 } 96 } 97 } 98 99 /******************************** END OF FILE ********************************/
本例用到的上位機IP為192.168.2.194,開放端口為8881
STM32的IP為192.168.2.8,開放端口為8880
先將STM32上電,然后通過網絡調試助手發送hello zorb。
STM32調試串口輸出以下信息:
get msg from 192:168:2:194 port:8881: hello zorb
四、最后
本文測試了lwip的udp功能,能正常收發,撒花。
github:https://github.com/54zorb/stm32-lwip
版權所有,轉載請打賞喲
如果你喜歡我的文章,可以通過微信掃一掃給我打賞喲