# lamp_esp32_module **Repository Path**: nicholas3388/lamp_esp32_module ## Basic Information - **Project Name**: lamp_esp32_module - **Description**: 四博智能台灯的ESP32模块 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-24 - **Last Updated**: 2026-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 智能台灯C3控制模块与主控的通讯协议 ## 帧格式(二进制协议,高效紧凑) +--------+--------+--------+--------+--------+--------+--------+--------+ | 0xAA | 0x55 | CMD | LEN | DATA | ... | CRC8 | 0x0D | +--------+--------+--------+--------+--------+--------+--------+--------+ | 帧头 | 帧头 | 命令 | 长度 | 数据 | | 校验 | 帧尾 | | 1B | 1B | 1B | 1B | N B | | 1B | 1B | 帧头: 0xAA 0x55 - 固定同步头 命令: 1字节,定义操作类型 长度: 1字节,DATA 字段长度(0-255) 数据: 变长,根据命令不同 CRC8: 从 CMD 到 DATA 最后一个字节的校验 帧尾: 0x0D - 回车符 ## 命令定义 | CMD | 名称 | 说明 | DATA 格式 | | ---- | --------------- | -------- | ---------------------------------------------- | | 0x01 | SET_SINGLE | 设置单个 LED | `[index, r, g, b]` | | 0x02 | SET_ALL | 设置全部 LED | `[r, g, b]` | | 0x03 | SET_MULTI | 设置多个 LED | `[n, idx1, r1, g1, b1, idx2, r2, g2, b2, ...]` | | 0x04 | EFFECT_BREATH | 呼吸灯效果 | `[r, g, b, speed]` | | 0x05 | EFFECT_RAINBOW | 彩虹效果 | `[speed, brightness]` | | 0x06 | EFFECT_RUNNING | 流水灯效果 | `[r, g, b, speed, direction]` | | 0x07 | EFFECT_CHASE | 追逐效果 | `[r, g, b, speed, length]` | | 0x08 | SET_BRIGHTNESS | 设置全局亮度 | `[brightness]` | | 0x09 | GET_STATUS | 获取状态 | 无 | | 0x0A | STOP_EFFECT | 停止效果 | 无 | | 0x0B | CLEAR | 关闭所有 LED | 无 | | 0x0F | ACK | 应答帧 | `[status, cmd]` | ## CRC8 算法 uint8_t crc8(const uint8_t *data, size_t len) { uint8_t crc = 0x00; for (size_t i = 0; i < len; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { crc = (crc & 0x80) ? ((crc << 1) ^ 0x07) : (crc << 1); } } return crc; } ## 测试用例 ### 测试用例1:设置全部红色(CMD_SET_ALL: 0x02) | 字节 | 值 | 说明 | | ---- | -------- | -------------------------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x02 | CMD | SET_ALL | | 0x03 | LEN | 3字节数据 | | 0xFF | DATA[0] | R=255 | | 0x00 | DATA[1] | G=0 | | 0x00 | DATA[2] | B=0 | | 0x8B | CRC | crc8([0x02, 0x03, 0xFF, 0x00, 0x00]) = 0x8B | | 0x0D | 帧尾 | | 发送: AA 55 02 03 FF 00 00 8B 0D 接收: AA 55 0F 02 00 02 B8 0D ### 测试用例2:设置第3个LED为绿色(CMD_SET_SINGLE: 0x01) | 字节 | 值 | 说明 | | ---- | -------- | -------------------------------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x01 | CMD | SET_SINGLE | | 0x04 | LEN | 4字节数据 | | 0x03 | DATA[0] | index=3 | | 0x00 | DATA[1] | R=0 | | 0xFF | DATA[2] | G=255 | | 0x00 | DATA[3] | B=0 | | 0x47 | CRC | crc8([0x01, 0x04, 0x03, 0x00, 0xFF, 0x00]) = 0x47 | | 0x0D | 帧尾 | | 发送: AA 55 01 04 03 00 FF 00 47 0D 接收: AA 55 0F 02 00 01 B9 0D ### 测试用例3:关闭所有LED(CMD_CLEAR: 0x0B) | 字节 | 值 | 说明 | | ---- | --- | -------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x0B | CMD | CLEAR | | 0x00 | LEN | 0字节数据 | | 0xF6 | CRC | crc8([0x0B, 0x00]) = 0xF6 | | 0x0D | 帧尾 | | 发送: AA 55 0B 00 F6 0D 接收: AA 55 0F 02 00 0B A3 0D ### 测试用例4:获取状态(CMD_GET_STATUS: 0x09) | 字节 | 值 | 说明 | | ---- | --- | -------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x09 | CMD | GET\_STATUS | | 0x00 | LEN | 0字节 | | 0xF4 | CRC | crc8(\[0x09, 0x00]) = 0xF4 | | 0x0D | 帧尾 | | 发送: AA 55 09 00 F4 0D 接收: AA 55 09 06 08 00 FF 01 00 00 A3 0D | 字节 | 值 | 说明 | | ---- | -------- | -------------------------------------------------------------- | | 0x09 | CMD | GET_STATUS | | 0x06 | LEN | 6字节 | | 0x08 | DATA\[0] | LED_NUM=8 | | 0x00 | DATA\[1] | current_effect=0 | | 0xFF | DATA\[2] | brightness=255 | | 0x01 | DATA\[3] | effect_running=1 | | 0x00 | DATA\[4] | reserved | | 0x00 | DATA\[5] | reserved | | 0xA3 | CRC | crc8([0x09, 0x06, 0x08, 0x00, 0xFF, 0x01, 0x00, 0x00]) = 需要计算 | | 0x0D | 帧尾 | | ### 测试用例5:设置亮度(CMD_SET_BRIGHTNESS: 0x08) | 字节 | 值 | 说明 | | ---- | -------- | -------------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x08 | CMD | SET_BRIGHTNESS | | 0x01 | LEN | 1字节 | | 0x80 | DATA[0] | brightness=128 | | 0xE7 | CRC | crc8([0x08, 0x01, 0x80]) = 0xE7 | | 0x0D | 帧尾 | | 发送: AA 55 08 01 80 E7 0D 接收: AA 55 0F 02 00 08 B2 0D ### 测试用例6:彩虹效果(CMD_EFFECT_RAINBOW: 0x05) | 字节 | 值 | 说明 | | ---- | -------- | -------------------------------------- | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x05 | CMD | EFFECT_RAINBOW | | 0x02 | LEN | 2字节 | | 0x96 | DATA[0] | speed=150 | | 0xC8 | DATA[1] | brightness=200 | | 0x3A | CRC | crc8([0x05, 0x02, 0x96, 0xC8]) = 0x3A | | 0x0D | 帧尾 | | 发送: AA 55 05 02 96 C8 3A 0D 接收: AA 55 0F 02 00 05 B5 0D ### 测试用例7:CRC错误测试(故意发送错误CRC) | 字节 | 值 | 说明 | | ---- | -------- | ------------------ | | 0xAA | 帧头1 | | | 0x55 | 帧头2 | | | 0x02 | CMD | SET_ALL | | 0x03 | LEN | 3字节 | | 0xFF | DATA[0] | R=255 | | 0x00 | DATA[1] | G=0 | | 0x00 | DATA[2] | B=0 | | 0x00 | CRC | **错误的CRC**(应为0x8B) | | 0x0D | 帧尾 | | 发送: AA 55 02 03 FF 00 00 00 0D 接收: AA 55 0F 02 01 02 1F 0D