深度剖析眼动模块串口通信协议:0x5A 0xA5帧结构、命令字与校验和机制全解读
【免费下载链接】eye-tracking-module源师兄扩展项目: 眼动模块 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/eye-tracking-module
眼动模块是源师兄组织打造的圆形屏外接扩展板,通过串口(UART)通信控制屏幕上眼睛的形态与内容。本文带你完整解读它的串口通信协议:0x5A 0xA5帧结构、常用命令字、校验和校验机制,帮助新手快速看懂并上手控制。
一、眼动模块能做什么?
根据 config.json 中的描述,该模块的核心功能是"通过串口控制眼动模块的眼睛状态"。在图形化编程环境中,你可以直接使用"眼动模块"分类下的现成积木(见 category.json):
- 🎨清屏颜色:清屏或填充白色、红色、蓝色、绿色、黄色、橙色
- 👀眼睛状态:眼睛、眨眼、向上看、向下看、向左看、向右看、左下看、右下看
积木的定义与 Python 代码生成逻辑位于 blocksdef.js,而所有底层协议实现都集中在 library/CircularScreenExtend.py 这一个文件中。
二、帧结构:如何读懂一帧 0x5A 0xA5 数据
设备发给眼动模块的数据都以"帧"为单位,统一帧结构如下:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 第 1~2 字节 | 0x5A 0xA5 | 帧头(魔数),接收方靠它识别一帧的起点 |
| 第 3 字节 | 长度 | "命令字 + 数据"的字节数 |
| 第 4 字节 | 命令字 | 指定本帧要执行的具体操作 |
| 第 5 字节起 | 数据 | 命令对应的参数 |
| 最后 1 字节 | 校验和 | 对帧内数据的累加校验值 |
💡 为什么用
0x5A 0xA5做帧头?这种"不易在正常数据中出现"的字节组合就是魔数(Magic Number),接收端在串口数据流中读到它,就表示一帧新命令到来了。
三、校验和机制:如何保证一帧数据没被传坏
串口线路易受干扰,协议因此加入了简单高效的累加校验:
校验和 = 帧中校验字节之前的所有字节之和,取低 8 位(
& 0xFF)
以"清屏"命令为例,整帧为0x5A 0xA5 0x04 0x01 颜色高 颜色低 校验和,其中校验和 =0x5A + 0xA5 + 0x04 + 0x01 + 颜色高 + 颜色低的低 8 位。接收端收到后重新求和,与末字节不符即判定丢包或串包,丢弃该帧。
在 library/CircularScreenExtend.py 中可以看到核心实现:
checksum = sum(command_data) & 0xFF command_data.append(checksum)⚠️ 细节提示:
0x22(图片叠图标)命令的校验口径略有不同,仅对"命令字 + 数据"部分求和(见build_image_icon_cmd),手工拼帧时务必对照源码。
四、命令字速查表:5 个常用串口命令一览
| 命令字 | 功能 | 数据内容 |
|---|---|---|
0x04 | 清屏 / 填充颜色 | 1 字节参数 + RGB565 颜色(2 字节) |
0x03 | 显示内置图片 | 图片 ID(0~72) |
0x11 | 画文字 | 模式/字号 + 文字色 + 背景色 + 坐标 + GB2312 文本 |
0x21 | 批量显示内置图标 | 图标数量 + 各图标的地址、宽高、坐标 |
0x22 | 大图上叠加图标 | 图片 ID、位置 + 图标列表 |
几个新手容易踩坑的点:
- 颜色用 RGB565 格式:源码
rgb888_to_rgb565把 RGB888 压缩成 5+6+5 位,再拆成高低 2 字节传输 - 文字用 GB2312 编码:含无法编码的字符时自动降级为 ASCII
- 多字节数值是大端序:坐标、地址等一律先发高字节、后发低字节
- 内置资源:模块闪存中预置了 4 张动物图标(牛、兔、狗、蛇)与 0~9 数字图标,见
icon_tables资源表
五、代码如何组帧:三步看懂原理
以show_pic_command(显示内置图片)为例,组帧只有三步:
- 拼出帧头
0x5A 0xA5、长度、命令字0x03和图片 ID - 计算并追加校验和
uart.write一次性写出整帧,再延时 50ms 等模块处理
你无需手工拼帧——library/CircularScreenExtend.py 已把每个命令的组帧逻辑封装成函数,调用时只填参数即可。
六、上手实战:连接串口与常见问题
- 串口选择:默认使用硬件 UART2;也可通过
SUART函数指定软串口引脚(P1 / P2 / P8 / P12 / P15 / P16) - 发送后等待:每条命令后都有 50ms 延时给模块处理时间,不要连续快速刷屏
- 调试口诀:命令无响应时,先查帧头写没写对,再手工验算校验和
- 眼睛状态的真相:眨眼、看左看右其实是依次发送
0x03命令切换不同图片 ID 实现的,例如"眨眼"就是播放 0 → 19 → 20 → … → 25 → 0 的序列,见eye_blink函数
总结
眼动模块的串口协议是一套经典的"帧头 + 长度 + 命令字 + 数据 + 校验和"结构:用0x5A 0xA5标记帧起点,用命令字0x03 / 0x04 / 0x11 / 0x21 / 0x22区分功能,用校验和保障数据完整。掌握这套帧结构后,你完全可以自定义新的眼睛状态与屏显内容,全部实现可参考 library/CircularScreenExtend.py。
【免费下载链接】eye-tracking-module源师兄扩展项目: 眼动模块 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/eye-tracking-module
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考