为采集卡增加信息显示小屏幕
为采集卡增加一块信息显示小屏幕,可以直接查看 USB 连接状态、采集参数和 HDMI 输入信息。采集卡通过 串口发送状态数据,由 独立 MCU 接收并解析,完成界面渲染与动态刷新。
小屏幕显示的是采集链路的状态与参数,不需要通过串口传输视频画面。采集卡负责提供状态,显示 MCU 负责将状态转换为文字、图标和数值。
方案结构
采集卡 独立 MCU 小屏幕
读取 USB / HDMI 状态 ──UART──→ 接收、组帧、解析 ──渲染──→ 动态显示采集卡发送完整状态包,MCU 将串口数据还原为状态字段,再更新屏幕。USB 插拔、采集启停或输入参数变化时,小屏幕可随新的状态包刷新。
小屏幕展示:输入与采集状态一目了然
下面两张展示图分别呈现 HDMI RX 输入状态 与 USB/UVC 采集状态。界面以状态灯突出连接信息,以大字号显示分辨率,并将速度、帧率和视频格式放在独立的信息区中,便于快速读取。
图片用于展示板卡与小屏幕的组合及界面风格;其中的数值和标签为展示内容,实际显示应以串口状态包为准,不作为采集性能指标。
HDMI RX:查看信号输入状态

HDMI RX 页面围绕输入端组织信息:上部显示 5V、HPD 与 CLK 状态,下部突出 输入分辨率与视频格式。图中以绿色状态灯搭配 ON、HIGH 等文字,让状态既有颜色提示,也有明确的文字含义。
实际界面可将协议中的 hdmi_fps 一并显示在分辨率旁,形成“宽 × 高 @ 帧率”的信息组合。检查输入链路时,可以先查看 5V、HPD 与时钟状态,再查看输入参数。
USB/UVC:查看主机连接与采集参数

USB/UVC 页面聚焦采集端:LINK 对应 USB 连接状态,SPD 对应连接速度,其他区域显示采集分辨率、帧率与视频格式。连接速度可按协议显示为 FS、HS 或 SS。
实现时还应为 UVC 启停状态 保留独立标识,分别对应 usb_link 与 usb_uvc_hdmi_clk 的 bit0,避免将 USB 已连接与 UVC 已开启混为同一个状态。
从界面信息映射到协议字段
显示 MCU 可将以下信息组织为两个页面,或在同一页面分区展示。USB 采集参数与 HDMI 输入参数应分别读取,不应直接将输入分辨率复制到采集区域。
| 区域 | 显示内容 |
|---|---|
| USB | 连接状态、连接速度、采集分辨率、帧率、视频格式、UVC 状态 |
| HDMI | 5V 状态、HPD 电平、时钟状态、输入分辨率、帧率、视频格式 |
串口状态包格式
状态数据按 小端序(little-endian)、无填充(no padding) 排列。在线路上传输时,每个数据字节转换为两个大写 ASCII 十六进制字符,再添加帧头和帧尾:
"AA" + 18 字节载荷的 ASCII HEX(36 个字符)+ "55"按这一声明,每帧共 40 个 ASCII 字符,即 40 个串口传输字节。帧头 "AA" 是两个字符 A,帧尾 "55" 是两个字符 5,不是直接发送二进制字节 0xAA 和 0x55。下表中的偏移指 HEX 解码后的载荷字节位置,不包含帧头和帧尾。
协议待确认项
当前协议声明载荷为 18 字节,但已提供的字段仅覆盖 [0]~[16],共 17 字节。第 [17] 字节的用途尚未提供,不能直接视为保留位或校验字节。下表暂将 HDMI 时钟状态按 [8] 的 bit1 整理,需与发送端确认。接收端实现前应统一这两项定义。
字段布局
| 偏移 | 字段 | 含义与取值 |
|---|---|---|
[0] | usb_link | USB 连接:0=OFF,1=ON |
[1] | usb_spd | USB 速度:0=UNKNOWN,1=FS,2=HS (USB 2.0),3=SS (USB 3.0) |
[2] | usb_h_l | 采集宽度低 8 位 |
[3] | usb_h_h | 采集宽度高 8 位 |
[4] | usb_v_l | 采集高度低 8 位 |
[5] | usb_v_h | 采集高度高 8 位 |
[6] | usb_fps | 采集帧率,单位 Hz |
[7] | usb_fmt | 0=NONE,1=MJPEG,2=YUV422,3=NV12,4=RGB |
[8] | usb_uvc_hdmi_clk | bit0:UVC 状态,0=OFF、1=ON;bit1:HDMI 时钟状态,0=OFF、1=ON(位归属待确认) |
[9] | hdmi_5v | HDMI 5V:0=OFF,1=ON |
[10] | hdmi_hpd | HDMI HPD:0=LOW,1=HIGH |
[11] | hdmi_h_l | 输入宽度低 8 位 |
[12] | hdmi_h_h | 输入宽度高 8 位 |
[13] | hdmi_v_l | 输入高度低 8 位 |
[14] | hdmi_v_h | 输入高度高 8 位 |
[15] | hdmi_fps | 输入帧率,单位 Hz |
[16] | hdmi_fmt | 0=NONE,2=YUV422,3=YUV420,4=RGB,5=YUV444 |
[17] | 待确认 | 当前资料未给出定义 |
USB 与 HDMI 的格式枚举应分别解析。例如,值 3 在 USB 格式中表示 NV12,在 HDMI 格式中表示 YUV420。原始说明中的 MIPEG、UNKNOW 在本文统一显示为 MJPEG、UNKNOWN,不改变对应数值。
小端分辨率解析
宽度和高度均由两个字节组成,低字节在前、高字节在后:
// p 指向完成 ASCII HEX 解码且通过长度检查的载荷。
uint16_t usb_width = (uint16_t)p[2] | ((uint16_t)p[3] << 8);
uint16_t usb_height = (uint16_t)p[4] | ((uint16_t)p[5] << 8);
uint16_t hdmi_width = (uint16_t)p[11] | ((uint16_t)p[12] << 8);
uint16_t hdmi_height = (uint16_t)p[13] | ((uint16_t)p[14] << 8);
uint8_t uvc_on = p[8] & 0x01;
// 待发送端确认 HDMI CLK 位于 p[8] 的 bit1 后使用:
uint8_t hdmi_clk_on = (p[8] >> 1) & 0x01;例如,宽度 1920 为 0x0780,对应的两个载荷字节为 80 07,在线路上表示为 ASCII 文本 "8007";高度 1080 为 0x0438,对应 38 04,在线路上表示为 "3804"。
MCU 接收与动态刷新
建议将串口接收、协议解析与界面刷新分开处理:
- 接收缓存:通过串口中断或 DMA 将数据写入接收缓冲区,避免在接收回调中执行整屏绘制。
- 完整组帧:串口数据可能分多次到达,也可能一次包含多帧。按确认后的固定帧长缓存数据,并检查帧头、帧尾与 HEX 字符是否合法。
- 状态解析:将每两个 HEX 字符还原为一个字节,按偏移解析多字节数值、状态位和格式枚举。
- 状态更新:完整解析成功后统一更新状态快照,避免界面同时显示新旧两帧的字段。
- 界面刷新:比较新旧状态,优先重绘发生变化的文字、图标和数值,减少不必要的整屏刷新。
载荷的 HEX 文本也可能出现 "AA" 或 "55",因此不能仅靠搜索下一个 "55" 判断帧结束。应按固定长度定位帧尾;校验失败时继续寻找候选帧头并重新组帧。
对于未知枚举值,界面可显示 UNKNOWN 并保留原始数值用于调试。若一段时间内没有收到有效状态包,应显示“状态超时”,避免旧数据继续被当作实时状态;超时时间需结合发送周期设置。
联调要点
- 确认两端串口电平、波特率、数据位、校验位、停止位和共地连接。
- 补齐第
[17]字节的定义,确认[8]的位布局与完整帧长。 - 约定状态发送周期,以及状态变化时是否立即发送。
- 分别验证 USB 插拔、UVC 启停、HDMI 接入与拔出时的显示更新。
- 验证分辨率、帧率和格式切换,以及分包、连续多帧、非法字符和接收超时场景。
完成协议对齐后,独立 MCU 即可围绕这些状态字段实现小屏幕界面,使采集卡的连接与工作状态在设备上直接可见。
