本文最后更新于37 天前,其中的信息可能已经过时,如有错误请发送邮件到2275012286@qq.com,或者在下方留言。
基于ESP32C6自组网下主从机ESP-NOW通用通信框架合集项目(停止维护)
想了解更多项目请搜索“项目”标签或者访问我的github仓库。
仓库地址:QianmoNai’s Repositories
本合集项目包含六个子项目:esp32c6主机、esp32c6从机、esp32c3蓝牙ESP-NOW双通道菜单遥控器、恒域威串口屏UI及通信设计、配套安卓app、主板PCB。
1.主机 (服务端)代码:项目地址:QianmoNai/ESP32C6_ESP-NOW_Server
2.从机(客户端)代码:项目地址:QianmoNai/ESP32C6_ESP-NOW_Client
3.遥控器代码:项目地址:QianmoNai/ESP32C3_contral
4.安卓app代码:项目地址-:QianmoNai/ESP32C3_Contral_App
5.恒域威串口屏
通过网盘分享的文件:串口屏代码.zip
链接: https://pan.baidu.com/s/135vUPJwXW4jxJ9nQ983HKg?pwd=esnk提取码: esnk
6.主板PCB
通过网盘分享的文件:ProPrj_机创-串口屏PCB_2026-04-27.zip
链接: https://pan.baidu.com/s/1LYYsUznD6_1wiVEgi8YJFA?pwd=x8w8 提取码: x8w8
1.项目背景
用于机创比赛的无线电机控制部分,目的是为了能够简化信号线的布线。基于前面文章”ESP32C6局域网下UDP通信项目”这篇文章,但是因为发现丢包和延迟比较大的缘故,并且原方案需要路由器才能实现组网通信,很不方便,所以选择放弃了UDP通信方式,改为ESP—NOW通信,通过ESP-NOW私有通信协议实现一主机多从机的控制方式,能过实现远程的对电机的控制,并且实现一对多控制。ESP‑NOW相比UDP无需路由器、无IP、延迟更低、功耗更小、启动更快、协议开销更小,更适合ESP32之间近距离、低延迟、低功耗的点对点直连通信。实测下来,ESP-NOW通信下的基本没有丢包,延迟也非常小,后续将确定采用ESP-NOW通信方案。
2.项目介绍
想要复刻实现请准备好ESP32C6-mini开发版(1~4个)、微雪ESP32C6板载1.47寸LCD屏开发板、esp32c3最小系统板、oled屏、恒域威串口屏。
ps:复现项目的话要根据情况修改主机和从机中的接收的MAC码地址。
1.内有串口通信协议,波特率都为115200,从到主这条通信链路,从机ESP作为状态机,持续转发从机MCU发来单字节数据给主机ESP,主机ESP再把此单字节数据再转发给主机MCU,最终的实现效果就是从机MCU发什么,主机MCU就接收到什么,发送频率由从机MCU决定,类似于无线串口。主到从这条通信链路,主机MCU发给主机ESP的命令格式为“XXXX”(最好加上换行符)每一位数字对应一个电机的目标控制值,如果接收命令“9999“,则返回当前的四个电机状态,格式为“XXXX”。例如主机ESP接收来自主机MCU串口命令“1234”(字符串类型)可以控制四个从机ESP的状态分别为0x01,0x02,0x03,0x04,四个从机MCU也能串口接收一次对应的状态值。此时主机MCU再发“9999”,则串口发送数据“1234”给主机MCU。这套通讯协议非常灵活,可以直接适用于各种需要无线通讯且需要一主控制多从的场景。
2.蓝牙与ESP-NOW双通道遥控器,ESP32C3开发板作为主控芯片,附带有四个按键,有oled显示屏菜单,对应四个从机的按键控制,按下能控制菜单或发送控制指令给主机,同时加入低功耗蓝牙,适配配套手机app。
3.恒域威串口屏UI及通信设计,吐槽一下厂商的上位机编译软件,用起来很玄学,仿真出来正常,但是烧录给串口屏就会白屏或者画面卡住,白屏问题居然把图片jpg转jpg格式一下就行了,但是开机画面卡住很奇怪,只有用例程项目里的mp4视频才可以正常跳转,换别的mp4视频最后就会卡住,甚至我把例程里的视频mp4转mp4格式一下也会卡住,不知道啥原因,总之就是很邪门。串口屏和主板MCU之间是通过串口直连使用了lua脚本实现,点击按钮后主机MCU就会收到对应单字节A1~A4指令。
4.安卓app使用的是Android Studio进行开发,此项目仅支持Android13及以上版本,在设置界面开启权限即再扫描连接即可使用,注意app是通过遥控器板子进行桥联给主机ESP发送指令的,遥控器那块板子必须上电。
5.主板PCB设计
3.项目内容(主从机通信协议的详细解释)
系统拓扑
当前默认通信链路如下:
主机串口输入 -> 主机 ESP32-C6 -> ESP-NOW -> 4 个从机
从机状态回包 -> ESP-NOW -> 主机 ESP32-C6 -> LCD 显示在线情况
外部 MCU -> 从机 UART -> 从机 ESP32-C6 -> ESP-NOW -> 主机
主机消息 -> ESP-NOW -> 从机 ESP32-C6 -> UART -> 外部 MCU
其中:
- 主机负责接收串口控制命令、广播状态、显示从机在线状态
- 从机负责接收主机广播、提取属于自己的状态位、通过 UART 回传给外部设备,并可将 UART 收到的字节转发给主机
通信协议
主机广播格式
主机通过 ESP-NOW 广播如下字符串:
MSG#1234@5678ms
含义如下:
1234:4 个从机当前控制状态
5678ms:主机启动后的时间戳
从机状态提取规则
从机通过 SLAVE_NUMBER 从 1234 中提取属于自己的状态位:
SLAVE_NUMBER = 1:千位
SLAVE_NUMBER = 2:百位
SLAVE_NUMBER = 3:十位
SLAVE_NUMBER = 4:个位
例如:
MSG#3874@20ms
则:
- 从机 1 提取
3
- 从机 2 提取
8
- 从机 3 提取
7
- 从机 4 提取
4
从机提取后,会通过 UART 输出:
<状态数字>\r\n
主机工程说明
主机定位
主机端是一个带 LCD 界面的控制中心,主要功能包括:
- 初始化 Wi-Fi STA 模式,不连接路由器
- 固定在 ESP-NOW 信道
1
- 初始化 LCD、背光、LVGL、RGB 灯、UART1
- 上电后向 4 个从机广播当前状态
- 接收 4 位串口指令并再次广播
- 接收从机回包,在 LCD 上显示 D1-D4 在线状态
主机当前功能
- ST7789T 屏幕驱动,分辨率
172x320
- LVGL 状态界面
- WS2812 RGB 灯控制
- UART1 指令输入,默认波特率
115200
- ESP-NOW 广播发送与接收
- 预留 UDP 模块代码,但默认未接入主流程
主机串口协议
主机串口输入规则:
- 输入必须是
4 位数字
- 每一位分别代表 1 个从机状态
9999 表示查询当前状态,不修改状态
示例:
0000 清零四个从机状态
1234 依次设置四个从机状态
9999 查询当前状态
主机硬件引脚
- WS2812 数据口:
GPIO8
- UART1 TX:
GPIO18
- UART1 RX:
GPIO19
LCD 接口:
- LCD SCLK:
GPIO7
- LCD MOSI:
GPIO6
- LCD MISO:
GPIO5
- LCD CS:
GPIO14
- LCD DC:
GPIO15
- LCD RST:
GPIO21
- 背光:
GPIO22
主机联调前必须检查
- 4 个从机 MAC 地址是否替换为真实地址
- 主从是否工作在同一信道
- 串口输入是否符合 4 位数字协议
从机工程说明
从机定位
从机端不是 LCD 演示程序,核心功能是:
- 作为 ESP-NOW 从机与主机通信
- 通过 UART1 接收外部 MCU 的单字节数据
- 将 UART 数据转发给主机
- 解析主机状态消息,并将自身状态通过 UART 回传
适合用于:
- 主从链路验证
- 无线状态回传
- 串口到 ESP-NOW 的桥接测试
从机当前行为
上电后会执行:
- 初始化 UART1
- 创建 UART -> ESP-NOW 转发队列
- 启动串口接收任务,非阻塞读取单字节数据
- 启动 ESP-NOW 任务,并以
STA 模式在固定信道上工作
- 接收主机消息、解析状态、单播响应主机
从机当前功能
- UART1 单字节接收与转发
- ESP-NOW 单播发送与接收
- 主机状态消息解析
- 按
SLAVE_NUMBER 提取对应状态位
- 将状态值以 ASCII 数字加
\r\n 的形式发送到串口
- 周期性输出通信统计日志
从机硬件与串口
- UART 端口:
UART1
- 波特率:
115200
- TX 引脚:
GPIO4
- RX 引脚:
GPIO6
- 数据格式:
8N1
建议接线:
| ESP32-C6 从机 | 外部设备 |
GPIO4 TX | 对方 RX |
GPIO6 RX | 对方 TX |
GND | 对方 GND |
从机联调前必须检查
master_mac 是否改为主机 MAC 地址
- 主从是否使用同一信道
SLAVE_NUMBER 是否设置正确
- UART 接线是否交叉且共地
联调步骤
1. 准备环境
安装支持 esp32c6 的 ESP-IDF 环境,并确认工具链可用。
2. 配置主机和从机
联调前至少检查:
- 主机的从机 MAC 地址配置
- 从机的
master_mac
- 主从双方 ESP-NOW 信道
- 从机
SLAVE_NUMBER
- 主从 UART 引脚与波特率
3. 编译
idf.py set-target esp32c6
idf.py build
首次构建可额外执行:
idf.py reconfigure
4. 烧录并查看日志
idf.py -p <PORT> flash monitor
5. 验证流程
建议按以下顺序验证:
- 主机启动后确认 LCD 正常显示
- 从机启动后确认 ESP-NOW 初始化成功
- 主机发送
1234 类串口命令
- 检查从机是否正确提取各自状态位
- 检查主机是否收到从机回包并更新在线状态
- 检查从机 UART 收到单字节后是否成功转发到主机
已知注意事项
- 当前默认信道为
1
- 主机默认按
4 个从机处理
- 从机
SLAVE_NUMBER 取值范围为 1-4
- 主机中的 UDP 模块虽然存在,但默认未接入主流程
- 某些代码注释、启动横幅或旧文档中的引脚说明可能与当前实现不一致,联调时应以实际头文件和代码赋值为准
- 从机侧有注释提到“信道 6”,但实际配置描述为信道
1,应统一按真实代码配置核对
- 项目当前更适合联调和演示,不适合作为未经整理的量产版本
故障排查
无法烧录
- 确认串口号是否正确
- 尝试降低烧录波特率
- 长按
BOOT 后重新下载
收不到 ESP-NOW 数据
- 主从设备信道是否一致
- 主机和从机 MAC 地址是否填写正确
- 双方是否都进入 ESP-NOW 工作状态
- 距离、供电、天线环境是否正常
UART 无数据
- 是否正确交叉连接:
TX -> RX、RX -> TX
- 双方波特率是否一致
- 是否共地
- 是否误按旧版引脚说明接线
从机状态值不对
SLAVE_NUMBER 是否设置正确
- 主机消息是否符合
MSG#xxxx@xxxms 格式
- 主机四位状态顺序是否和从机提取规则一致
主机在线状态误判
- 从机是否及时回包
- 当前在线判定窗口较短,网络抖动时可能短暂显示离线
后续建议
如果要把这套工程整理成可复用项目,建议优先补齐:
- 将 MAC、信道、串口参数改成可配置项
- 增加主从通信时序图
- 增加接线图、实物图或 UI 截图
- 输出独立的协议文档,统一状态字定义
- 清理未接入主流程的模块,避免 README 与代码行为继续偏离