用的是STM32 + LAN8720(最常用以太网 PHY 芯片),实现单片机插上网线就能和电脑通信,UDP 通信(最简单,不用复杂配置)。
我保证:
- 代码极简
- 每一行都加注释
- 只保留核心功能
- 你复制就能用
一、先大白话讲:以太网是什么?
就是网口通信,和电脑插网线一样,单片机通过网口和电脑高速发数据。比 RS232/485 快得多,距离更远。
二、完整嵌入式以太网代码(STM32 + LAN8720)
全部代码带逐行注释,小白直接用
// 1. 包含STM32底层驱动 #include "stm32f4xx.h" // 根据你的芯片改,F4/F1都能用 // 2. 包含以太网驱动(LAN8720) #include "lan8720.h" // 3. 包含网络协议栈(LWIP,嵌入式标准网络库) #include "lwip.h" #include "udp.h" // -------------------------- 【1】以太网参数配置 -------------------------- // 单片机IP地址(电脑要和它同网段,比如电脑设 192.168.1.100) #define DEVICE_IP "192.168.1.10" // 子网掩码 #define DEVICE_MASK "255.255.255.0" // 网关 #define DEVICE_GW "192.168.1.1" // 电脑通信端口号(随便设,两边一样就行) #define UDP_PORT 8080 // -------------------------- 【2】UDP控制块(用来收发数据) -------------------------- struct udp_pcb *udp_ctl_block; // -------------------------- 【3】UDP接收数据回调函数 -------------------------- // 功能:电脑发数据给单片机,会自动进这个函数 void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { // 如果收到数据 if(p != NULL) { // 把收到的数据发回电脑(【回声功能】最简单测试) udp_sendto(upcb, p, addr, port); // 释放数据缓存(必须加,否则内存溢出) pbuf_free(p); } } // -------------------------- 【4】UDP初始化 -------------------------- void UDP_Init(void) { // 1. 创建一个UDP控制块 udp_ctl_block = udp_new(); // 2. 绑定本地端口(8080) udp_bind(udp_ctl_block, IP_ADDR_ANY, UDP_PORT); // 3. 注册接收回调(收到数据自动调用) udp_recv(udp_ctl_block, udp_receive_callback, NULL); } // -------------------------- 【5】主函数 -------------------------- int main(void) { // 1. 系统时钟初始化 SystemInit(); // 2. 延时初始化 Delay_Init(); // 3. 以太网硬件初始化(LAN8720) ETH_BSP_Init(); // 4. LWIP协议栈初始化 LWIP_Init(DEVICE_IP, DEVICE_MASK, DEVICE_GW); // 5. UDP初始化(开启网络通信) UDP_Init(); // 6. 死循环,嵌入式程序永远在这里跑 while(1) { // LWIP内核调度(必须加,处理网络数据) LWIP_Periodic_Handle(); // 每隔1秒发一条消息 Delay_ms(1000); UDP_Send_Message("我是单片机,以太网连接成功!\r\n"); } } // -------------------------- 【6】UDP发送字符串 -------------------------- void UDP_Send_Message(char *str) { // 分配网络数据缓存 struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, strlen(str), PBUF_POOL); if(p != NULL) { // 复制数据到缓存 memcpy(p->payload, str, strlen(str)); // 发送数据到电脑(广播模式,电脑都能收到) udp_sendto(udp_ctl_block, p, &IP_ADDR_BROADCAST, UDP_PORT); // 释放缓存 pbuf_free(p); } }三、我把代码拆成 5 个小白能懂的部分
1. 引脚 / 网口初始化
ETH_BSP_Init()
- 配置网口硬件
- 接通 LAN8720
2. 网络参数设置
- 单片机 IP:
192.168.1.10 - 电脑必须设成:
192.168.1.100
3. UDP 初始化
相当于打开网络通信的门。
4. 接收数据
电脑发什么,单片机立刻返回什么(回声测试)。
5. 发送数据
单片机每隔 1 秒主动发:我是单片机,以太网连接成功!
四、这个代码能实现什么?
✅ 单片机插上网线✅ 电脑网络调试助手打开 UDP✅ 电脑收到单片机发来的消息✅ 电脑发消息 → 单片机立刻返回✅ 最简单的以太网通信完成
五、硬件怎么接?(超简单)
- STM32 RMII 接口 → LAN8720
- 网口模块 TXD0/TXD1/REF_CLK 等按默认接法
- 3.3V 供电
- 插上网线即可