LWIP协议栈入门教程(4)

发布时间:2026/7/19 13:50:22
LWIP协议栈入门教程(4) 第四步总结与常见问题4.1 lwIP 的三种编程接口接口类型缩写特点适用场景RAW APIRAW最底层、非阻塞、回调驱动裸机移植、性能敏感场景NETCONN APINETCONN基于操作系统的信号量/邮箱带RTOS的场景较易使用SOCKET APISOCKET类似BSD Socket最像PC编程熟悉Socket编程的开发者4.2 常见问题Q为什么我连不上板子A按以下顺序排查PHY通信是否正常→ 看串口打印 “MCU与PHY芯片通信失败”DHCP拿到了IP吗→ 看LCD上显示的IP地址防火墙是否拦截了→ 关掉PC防火墙试试网线插好了吗→netif_is_link_up()返回true吗Qtcp_recved()不调用会怎样AlwIP 的 TCP 接收窗口会逐渐减小到 0对方不能再给你发数据。就像你的邮箱满了却不取信邮递员就不再投递新信了。Q为什么要在主循环中频繁调用lwip_periodic_handle()和lwip_pkt_handle()A裸机环境下没有操作系统来调度任务必须手动做两件事lwip_periodic_handle()— lwIP 的各种定时任务TCP超时重传、ARP缓存老化、DHCP重试等lwip_pkt_handle()— 检查以太网 DMA 有没有收到新数据有的话送入 lwIP 协议栈两个函数缺一不可只调用lwip_periodic_handle()能 Ping 通但收不到 TCP/UDP 数据就是因为漏了lwip_pkt_handle()。Qudp_connect()真的建立了连接吗AUDP 的connect()和 TCP 完全不同。UDP 的connect()只是在本地记录了一下对方的 IP 和端口并没有真正的网络握手。之后调用udp_send()时就不需要每次指定地址了。附lwIP 文件结构速查Middlewares/lwip/ ├── arch/ ← 平台相关代码你的移植层 │ ├── lwip_comm.c/h ← lwIP初始化、DHCP处理 │ ├── ethernetif.c/h ← 网卡驱动适配层 │ └── lwipopts.h ← lwIP配置选项使能/关闭功能 │ ├── lwip_app/ ← 用户应用程序 │ └── lwip_demo.c/h ← UDP/TCP测试示例 │ └── src/ ← lwIP官方源码不用改 ├── include/ ← 头文件 ├── core/ ← 核心协议IP、TCP、UDP、ICMP等 └── netif/ ← 网络接口层etharp、ethernet等lwipopts.h —— lwIP 配置文件的灵魂lwipopts.h是 lwIP 的总开关控制功能使能和内存分配。核心配置项速查配置宏裸机值FreeRTOS值作用NO_SYS101无操作系统裸机0有操作系统LWIP_DHCP0或11是否启用 DHCP 客户端LWIP_NETCONN01是否启用 NETCONN API需要 OSLWIP_SOCKET01是否启用 Socket API需要 OSMEM_ALIGNMENT44内存对齐字节数STM32F4 用 4MEMP_NUM_TCP_PCB510最大 TCP 同时连接数MEMP_NUM_UDP_PCB44最大 UDP 同时连接数TCP_MSS14601460TCP 最大段大小MTU-40TCP_SND_BUF6553565535TCP 发送缓冲区大小字节TCP_WND6553565535TCP 接收窗口大小字节LWIP_ICMP11是否启用 ICMPPing 用LWIP_RAW0或10或1是否启用 RAW APILWIP_DNS11是否启用 DNS 域名解析LWIP_HTTPD0或11是否启用 httpd Web 服务器LWIP_SNTP01是否启用 SNTP 时间同步MEM_SIZE根据需要根据需要lwIP 堆内存总大小字节配置原则// lwipopts.h 核心思路按需裁剪//// 裸机最小配置仅能 Ping:// NO_SYS1, LWIP_RAW1, LWIP_ICMP1//// 裸机 UDP/TCP:// 在上面基础上 LWIP_UDP1, LWIP_TCP1//// FreeRTOS NETCONN:// NO_SYS0, LWIP_NETCONN1//// FreeRTOS Socket:// NO_SYS0, LWIP_SOCKET1, LWIP_NETCONN1