☰
ESP32变身树莓派无线网卡:串口SLIP方案从原理到配置
2026/10/18 1:22:48 网站建设 项目流程

如果你手头有一块初代树莓派 Zero,或者某块老主板,大概都会遇到同一个尴尬:插上电之后系统起来了,但死活没有 WiFi。翻箱倒柜找 USB 无线网卡,要不就是驱动不认,要不就是芯片方案早就被内核抛弃。这个场景我太熟了。今天要聊的不是再买一张网卡,而是把手边吃灰的 ESP32 开发板利用起来,把它变成一颗“开源无线网卡”,插进树莓派的 USB 口,让它老老实实联网。

这个方案的好处在于 ESP32 本身带完整的 2.4GHz WiFi 能力,价格便宜、资料公开、固件可自己改。树莓派侧不管跑的是官方系统还是精简版 Linux,只要按步骤把串口或 USB 设备挂载成网络接口,就能把 ESP32 当作一块网卡来用。如果你正在为“树莓派没有 WiFi”发愁,或者单纯想试试用一颗微控制器给 Linux 扩展网络,这篇文章应该能帮你少走不少弯路。

1. 先判断:树莓派是真没 WiFi,还是系统没认出来

很多新手拿到设备第一反应就是sudo apt install装驱动,但树莓派这种板子,WiFi 模块是不是存在,硬件层面基本决定了一半。先别急着插 ESP32,花两分钟把问题定位准,后面才不白折腾。

1.1 哪些树莓派型号天生没有 WiFi

树莓派型号非常多,带不带 WiFi 不是看外观大小,而是看尾缀和代际。我自己经手过的板子里面,最容易踩坑的是初代树莓派 Zero,以及早期的 Model A/B 系列。把这些不同型号的硬件差异放在一起看,就非常清楚:

型号板载 WiFi板载蓝牙备注
树莓派 Zero无无最常见的“没 WiFi”选手,只有一个 USB 口
树莓派 Zero W / WH有有后缀 W 就是 Wireless 的意思
树莓派 Zero 2 W有有性能比初代 Zero 好很多
树莓派 1 Model B / A+无无老古董,基本不建议跑现代系统
树莓派 2 Model B无(部分版本)无需要看具体批次,绝大多数没有
树莓派 3 Model B / B+有有从这代开始 WiFi 成标配
树莓派 4 / 400 / 5有有双频 WiFi,默认都有

如果你手里的板子是在“树莓派 3B”之前买的,又没带 W 后缀,那大概率就是硬件层面没有 WiFi 模块。这种情况下,再怎么调系统配置都没用,只能通过外接设备补上。

1.2 三分钟排查:系统里到底有没有无线网卡

如果实在不确定,进系统敲几行命令就能判断。用 SSH 或者显示器接上去,先看一下目前有哪些网络接口:

ip link show

正常有 WiFi 的板子,会看到一个类似wlan0的接口。如果只有eth0和lo,那基本可以确认硬件上没有无线网卡,或者驱动没加载。再往下排查是不是驱动问题,可以看:

sudo dmesg | grep -i wifi sudo rfkill list lsusb

lsusb能看到 USB 总线上的设备,如果有 USB WiFi 网卡插着,会显示网卡芯片型号。rfkill list是看无线开关有没有被软件锁住。有的系统默认把 WiFi 模块 block 了,执行sudo rfkill unblock all就能恢复。如果dmesg里完全看不到brcmfmac之类的固件加载日志,而板子又确实标注支持 WiFi,那可能是系统镜像问题;反之,硬件没有模块就是没有模块,别浪费时间。

1.3 确认之后:为什么先考虑 ESP32 而不是买 USB 网卡

确认硬件缺 WiFi 之后,方案无非三种:USB WiFi 网卡、树莓派 HAT 网络模块、把 ESP32 当网卡。USB 网卡是最省事的,但小厂芯片在 Linux 下的驱动问题真的能把人逼疯。很多网卡芯片在内核更新后直接失踪,有些需要手动编译驱动,树莓派这种 ARM 平台还未必能顺利编过。手里如果正好有 ESP32 开发板,自己刷固件做一张“软件网卡”,成本几乎为零,而且整条链路完全可控。这也正是“开源无线网卡”的意义:硬件方案公开、固件源代码能看到、坏了可以自己改。

2. 一颗 ESP32 凭什么能当“无线网卡”:原理先搞明白

在做任何操作之前,我建议先理解一下 ESP32 能扮演网卡的底层逻辑。它不是魔法,本质上是把 Linux 网络栈与 WiFi 天线之间的一条“通路”打通了。

2.1 网卡的本质:内核只关心一个网络接口

对 Linux 内核来说,“网卡”并不一定非要是一张 PCIe 卡或者 USB 高通的芯片。只要有一个驱动程序能够提供net_device接口,内核就认为这是一块网卡。数据从网络协议栈出来后,驱动把它交给底层介质——可以是网线、可以是 USB,也可以是串口。所以理论上,任何能用硬件收发数据的设备,都有可能被包装成网卡。

ESP32 的情况是:它本身有完整的 802.11 b/g/n 协议栈,能扫描、能连接、能做热点。树莓派这边只需要一个通道,把 IP 数据包送到 ESP32 的天线上。这个通道怎么建立,就成了方案的关键。

2.2 串口上的 SLIP:最朴素也最可靠的封装方式

一般来说,最经典 ESP32 开发板上的那颗 ESP32 芯片本身没有原生 USB 外设,板子上带的是一个 USB 转串口芯片(常见的是 CP2102 或 CH340)。树莓派插入后,看到的是一个串口设备,比如/dev/ttyUSB0。串口只能传字节,不能直接跑 IP 协议栈。这时就需要一个链路层协议,把网络帧封装进串口字节流里。

SLIP 是个非常讨巧的选择。它的全称是 Serial Line Internet Protocol,原理极其简单:用两个特殊字节表示帧的开头和结尾,把 IP 包分割成一段段字节流,通过串口发送。虽然它没有压缩、没有协商、没有 CRC,但正是因为简单,所以两边实现起来几乎不可能出错,CPU 占用也低。PPP 也能干这事,但 PPP 带 LCP、NCP、认证、压缩协商,对一颗微控制器来说,处理开销明显更大。很多社区固件最终选了 SLIP,原因就是“一根管子传字节,别整花活”。

你可以把它想象成两个人隔着一堵墙用吸管传递纸条,SLIP 就是约定“纸条卷起来,中间用绳结隔开”。绳结知道怎么打就行,不要搞复杂加密信封。对树莓派和 ESP32 这对组合来说,这种朴素约定反而最稳。

2.3 ESP32-S2 / S3 的原生 USB 是另一条更省事的路线

后来 ESP32-S2 / S3 芯片加入了原生 USB 外设,整个格局就变了。刷上合适的固件之后,树莓派插入这板子,会直接识别成一张 USB 网卡(比如 RNDIS 或 ECM 设备),像多了个enx...接口一样。不需要搞 SLIP、不需要串口权限,内核把 USB 网络设备驱动加载好,直接dhclient就能拿到 IP。如果你手头是新买的 ESP32-S3 开发板,优先考虑这条路,省心非常多。

不过,很多老玩家手上的 ESP32 还是经典款,这篇文章后面讲的实际配置,我会以这种更复杂、更常见的串口 + SLIP 路线为主,原生 USB 路线单独提醒一下。

3. 动手前准备:选板、接线和烧录环境

方案再好,准备工作没做好照样翻车。我见过太多人拿着一条只能充电的线,折腾半天发现设备根本没枚举成功。这一节把最容易忽略的硬性条件说清楚。

3.1 硬件选型:老 ESP32 还是 ESP32-S3

如果还没买板子,我的建议是直接看 ESP32-S3 或者 ESP32-S2 的开发板,原生 USB 会让后续使用体验好很多。但如果你和我一样,抽屉里躺着三四块经典的 ESP32 DevKitC,完全可以用,只是要走串口方案。

板子型号影响的是固件类型和配置方式,整体思路不变。要留意的是,有些廉价开发板用的 USB 转串口芯片很杂,树莓派内核可能缺驱动。正经的 DevKitC 一般用 CP2102,Linux 自带驱动,很稳。CH340 也支持,但有些精简内核镜像没启用,需要检查lsmod里有没有ch341。

3.2 接线和供电:别拿充电线凑合

连接方式很简单:USB 数据线一端插树莓派的 USB 口,一端插 ESP32 开发板。但如果用的是那种只有供电能力、没有数据线的线,怎么插都不会有反应。区分方法很土但有效:把线插到电脑上,看能不能让手机弹出 USB 调试选项,或者看dmesg有没有新设备。千万别拿充电器的线赌运气。

供电同样重要。树莓派 Zero 只有一个 USB 口,既要给系统供电又要给外设供电,带 ESP32 这种低功耗板子问题不大,但如果你同时接了键盘、鼠标 Hub,就可能出现 ESP32 反复重启。万全之策是用一个带独立供电的 USB Hub,或者给 ESP32 单独接 5V 电源。天线距离尽量拉开一点,不然 ESP32 的射频干扰也可能让树莓派的 USB 信号不稳。

3.3 安装 esptool 并确认端口识别

烧录固件之前,电脑或树莓派上要装 esptool。树莓派上可以直接用 pip 装:

sudo pip3 install esptool

插上 ESP32 后,先确认系统看到了串口:

ls /dev/ttyUSB* dmesg | tail -20

正常情况下会看到ttyUSB0或ttyACM0。如果看到芯片枚举失败,先换 USB 线,再换 USB 口。确认设备存在后,读一下芯片信息,确保板子判断正确:

python3 -m esptool --port /dev/ttyUSB0 chip_id

如果输出芯片型号和 MAC 地址,说明烧录链路是通的,可以进入下一步。

4. 刷固件:把 ESP32 变成真正能用的无线网卡

准备工作的重头戏是给 ESP32 刷入“无线网卡固件”。社区里有现成的编译产物,自己不写代码也能完成。这里我会分使用现成固件和简单编译两条路讲。

4.1 获取固件:优先用现成合并镜像

开源社区维护的 ESP32 WiFi 网卡固件一般会提供两个东西:一个是源码工程,一个是编译好的合并 bin。对多数人来说,直接用合并 bin 就够了。这个合并 bin 可以从 flash 起始地址0x0开始烧写,不用关心分区表挪来挪去的问题。

烧录前最好先擦除一次 flash,避免旧固件里的配置残留影响新固件:

python3 -m esptool --chip esp32 --port /dev/ttyUSB0 erase_flash

擦除完成后,写入合并固件。以我常用的烧录速度为例:

python3 -m esptool --chip esp32 --port /dev/ttyUSB0 --baud 921600 write_flash -z 0x0 usb_wifi_adapter.bin

如果使用的是 ESP32-S3,把--chip esp32换成esp32s3,端口也可能是/dev/ttyACM0。烧录完成后,按一下 ESP32 开发板上的 EN/RST 键让固件启动。

这里有个很常见的坑:不同固件要求的烧录地址不一样。有些源码发布的固件要求把应用镜像写到0x10000,bootloader 写到0x1000,分区表写到0x8000。如果不是合并 bin,千万别闭眼从0x0烧。买开发板时附带的 README 或固件发布页都会写明偏移地址,照着来就行。

4.2 首次启动:看串口日志确认固件活着

烧完固件之后,用一个串口终端软件连到/dev/ttyUSB0,波特率一般是 115200,看启动日志:

sudo screen /dev/ttyUSB0 115200

如果固件正常,你会看到类似启动信息、WiFi 初始化日志,甚至固件自己创建的 AP 名字。这时候按 Ctrl+A 再按 K 退出 screen。注意,如果你用的是 SLIP 固件,等到后面的网络配置阶段,这个串口会被网络协议占用,不能同时拿来当调试终端看日志。这是一个容易混淆的地方:很多时候你以为固件没起来,其实只是日志串口和 SLIP 数据通道共用了同一个物理串口。

4.3 想自己编译固件:需要 ESP-IDF

如果你用的是某个开源固件的源码,自己编译也不算难,前提是装上 ESP-IDF 工具链。一般步骤是:

git clone --recursive <固件源码地址> cd <固件目录> idf.py set-target esp32 idf.py menuconfig

在 menuconfig 里可以配置 WiFi 工作模式、波特率、SSID、密码、是否开启 DHCP 等核心参数。配置完成后:

idf.py build idf.py -p /dev/ttyUSB0 flash

第一次编译会下载不少工具链,时间比较长。我自己的经验是,如果只是想让树莓派上网,直接刷别人编译好的合并固件最省事;如果你打算把 ESP32 顺便做点传感器采集、自定义协议,再折腾 ESP-IDF 也不迟。

5. 树莓派侧配置:把串口变成网络接口,拿到 IP 才算真成功

固件刷完,ESP32 本质上只是一台“待命”的 WiFi 设备,树莓派这边还需要把串口挂载成网络接口。这一步是整个过程中最容易出问题、也最有成就感的部分。

5.1 权限和用户组:先让普通用户可以碰串口

树莓派默认用户pi不在dialout用户组里,直接操作串口设备会报 Permission denied。先把自己加进去:

sudo usermod -a -G dialout $USER

然后重新登录或者重启树莓派,让用户组生效。此外,如果用slattach这类工具,最好确认系统已经安装,树莓派官方系统自带,精简系统可能需要补装:

sudo apt install net-tools dhcpcd5

5.2 挂载 SLIP 接口

插上 ESP32 之后,确认设备节点出现:

ls /dev/ttyUSB0

然后执行挂载命令:

sudo slattach -p slip -s 115200 /dev/ttyUSB0

这里的-p slip指定协议类型,-s 115200是波特率,必须和固件里配置的波特率一致。如果固件默认是 460800,这里就要改成 460800。执行完ip link show,应该能看到一个新增的sl0接口。

接下来把它启用,并获取 IP:

sudo ip link set sl0 up sudo dhclient sl0

有的固件本身会给对端分配一个固定 IP,这时不需要 DHCP,直接手动配置也可以:

sudo ip addr add 192.168.4.2/24 dev sl0

具体用哪个网段,看固件文档里写的 AP 网段。以最常见的 ESP32 软路由式固件为例,主机端通常是192.168.4.x这一段。

5.3 验证连通性:从 ping 网关到访问公网

拿到 IP 后,先 ping 一下网关,确认链路通不通:

ping -c 4 192.168.4.1

如果网关能通,再试公网域名解析:

ping -c 4 aliyun.com curl -I http://example.com

DNS 有解析说明 DHCP 已经拿到了 DNS 配置,curl能返回响应说明整条 TCP/IP 通路真的通了。到这一步,树莓派就已经把这颗 ESP32 当成了一张可用的无线网卡在用。

6. 实测感受:速度、稳定性、文档里没写的坑

方案跑通是一回事,能不能在日常场景里用,是另一回事。我前后折腾过好几套不同固件和不同板子,有些体会必须是亲手试过之后才有的。

6.1 实测吞吐量参考:别指望跑满宽带

串口 SLIP 方案的本质瓶颈是波特率。以 115200 波特率为例,串口 8N1 格式下原始数据速率约 11.5 KB/s,再扣掉 SLIP 帧头、IP 头,实际能获得的 TCP 吞吐量可能只有 40~70 KB/s。浏览文字类网页、SSH 操作、收发 DNS 查询完全没问题,但下载一个几十 MB 的安装包会非常煎熬。

把波特率调到 460800 之后,实测吞吐能到 200~300 KB/s 左右,体感明显改善。这是我在常见 USB 转串口芯片和 ESP32 固件组合下的经验范围,不同固件差异不小。如果用的是 ESP32-S2/S3 的原生 USB 网卡方案,走 USB 网络类协议,吞吐能高出一大截,接近普通 USB 无线网卡的水平——这也是我更推荐新板子走原生 USB 路线的原因。

6.2 高频坑位清单:对照排查

这套方案踩过的坑,我列一个清单出来,几乎每条都有人问过我:

现象真正原因解决方向
插上没任何ttyUSB*线是充电线,或芯片内核没驱动换数据线;dmesg确认芯片
有ttyUSB0但slattach报参数错误固件用的不是 SLIP,可能是 PPP按固件说明换-p ppp
sl0起来但 IP 拿不到DHCP 租约异常,或固件没开 DHCP手动配 IP,看固件默认网段
能 ping 通网关,上不了公网ESP32 的 NAT 转发没开检查固件配置,或把 ESP32 设为桥接
波特率不对出现乱码或连接中断串口速率两边不一致查看固件默认波特率并同步
跑一会断线USB 供电不足或 WiFi 省电改善供电,关掉 ESP32 省电模式
树莓派 CPU 居高不下串口中断 + SLIP 软中断开销降低轮询频率,或换原生 USB 方案

6.3 长期运行稳定性:加个看门狗心理更稳

这套方案适合临时使用,但如果你打算让树莓派长期在线,比如做个低功耗网络服务台,稳定性就得认真处理。最重要的两点:一是供电,尽量用带独立电源的 Hub;二是链路恢复,ESP32 固件大概率不会自己重启,但slattach进程可能会因为串口错误退出。可以写一个简单的 systemd 服务,如果进程挂掉就自动拉起来。

实际运行中,ESP32 的 WiFi 偶尔也会掉线重连。如果固件支持,建议把 STA 重连功能打开,同时在树莓派侧写个 cron,每隔几分钟检查一次网关,不通就重启slattach进程。这样做下来,连续跑一个月不出问题是很正常的。

7. 进阶玩法:自动连接、双模模式和调优思路

当整个链路稳定后,你会发现 ESP32 干的不只是“网卡”这一件事。它是一台有独立 CPU 的无线设备,可以做很多普通网卡做不了的事情。

7.1 开机自启:把配置固化成 systemd 服务

总不能每次开机都手动敲三行命令。在树莓派上用 systemd 管理最省事。新建一个服务文件:

sudo nano /etc/systemd/system/slip-esp32.service

内容大致是这样的思路:

[Unit] Description=ESP32 SLIP Wireless Adapter After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/slattach -p slip -s 115200 /dev/ttyUSB0 ExecStartPost=/bin/sh -c 'sleep 2 && ip link set sl0 up && dhclient sl0' RemainAfterExit=yes [Install] WantedBy=multi-user.target

然后启用:

sudo systemctl enable slip-esp32.service sudo systemctl start slip-esp32.service

注意ExecStartPost里用了sleep 2,是为了给内核一点时间创建sl0接口。如果你用的是原生 USB 网卡固件,服务里甚至不需要slattach,直接把ip link和dhclient写成一条启动脚本就行。

7.2 AP + STA 双模:一边上网一边发热点

普通 USB 无线网卡只能扮演一个角色:要么连路由器,要么发热点。ESP32 却可以同时做两件事——它的 WiFi 硬件支持 SoftAP 和 Station 双模并发。你可以让 ESP32 作为 STA 连上家里的 Wi-Fi,同时开启一个独立热点,树莓派通过 USB/串口挂到 ESP32 的 AP 网段,其他手机也能连这个 AP。

这个设计特别适合把树莓派当成一个带 WiFi 分享功能的嵌入式服务器。树莓派不需要插在路由器旁边,只要有电和一台 ESP32,它就能成为一个迷你无线网关。配置方式在固件源码的 menuconfig 里就能选:WiFi 模式选 STA+AP,填上要连接的路由器 SSID 和密码,再设置 AP 自己的 SSID 和密码。

7.3 几个值得动手的调优点

性能优化可以从三个方向入手。第一,调高串口波特率。在固件里把波特率改成 460800,树莓派侧的命令参数同步改成 460800,吞吐提升明显。第二,关闭 WiFi 的省电模式。ESP32 默认的省电策略会周期性休眠,对网络传输的延迟和吞吐都有影响,不开省电时数据链路更稳。第三,调整 SLIP 接口的 MTU。串口链路 MTU 过大容易导致分片和重传,建议设成 1400 左右:

sudo ip link set sl0 mtu 1400

很多时候,只改一个 MTU 就能解决不少“能 ping 通但网页打不开”的诡异问题。

最后再说一个我自己的使用心得。每次向别人推荐这套方案,总会被问“为什么不直接花几十块买 USB 无线网卡”。我的回答是:如果你手里有吃灰的 ESP32,这方案确实零额外成本;但更重要的是,当整条链路都是开源的、可见可改的,树莓派和 ESP32 之间就不再只是“网卡”和“主机”的关系,而是一个你可以随意注入逻辑的组合。比如让 ESP32 顺带上报温度、监测电压、甚至在断网时重启树莓派——这些附加能力,普通无线网卡给不了你。下次拆到一块没有 WiFi 的旧树莓派,先别急着吃灰,给它配一颗 ESP32,你会发现事情突然变得有趣起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询