# AMI 仪表通讯交接文档 屏幕接口 1.2;MCU CAN 协议 2.1(CAN1 500K / CAN2 250K) | 2026-10-03 适用工程:AMI.HMI;屏幕 TJC4827X543_011,480 × 272;编辑器 USART HMI 1.68.1.3037。本文以随附的精简指令版工程为准。 v2.1 已烧录并通过 CAN1 500K(SDC)与 CAN2 250K(BMS)分别到官方 HMI 调试器的测试,含两路各六个任务确认/取消;见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。下文的旧模拟器及 v2.0 测试描述属于历史记录,物理串口屏、真实节点和两路同时接入仍待实测。 2026-10-03 补充:dash 增加全局虚拟浮点控件 `lvbat`,两位小数,`dash.lvbat.val=1230` 显示 12.30 V,来源为 SDC ADC。当前 MCU CAN 输入见 [SDC_BMS协议.md](SDC_BMS协议.md);原整数高压电压/电流控件四舍五入为 1 V / 1 A。灰色数值表示未知或失效。SDC GPIO 尚无具名安全状态映射,当前 MCU 不生成正常/故障判断。 ## 1. 接手先看这三点 主控 → 屏幕:发送文本指令,末尾必须追加三个实际字节 FF FF FF。屏幕 → 主控:用户确认任务后发送固定 6 字节帧 AA 55 01 NN 0D 0A。这两种帧的结束方式不同。 debug 状态只发送 d0~d15 的数值;0=未知,1=正常,2=故障。屏幕自动处理中文和颜色,不再要求主控发送 txt/pco。 任务帧表示用户选择请求。仪表没有实现主控执行确认、运行完成回传或安全互锁裁决,主控必须自行判断能否执行。 ## 2. 串口与发送规则 | 项目 | 当前约定 | | --- | --- | | 波特率 | 9600(Program.s 中 baud=9600) | | 串口格式 | 联调使用 8N1;实物 UART 参数及电平按该型号规格书确认 | | 接收模式 | recmod=0,使用屏幕原生文本指令协议 | | 指令编码 | dN=状态 等指令为 ASCII;发送中文时使用 GB2312 | | 指令结束 | 每条指令后加 FF FF FF;不需要 CR/LF,不发送字符串“FF FF FF” | | 接线 | 主控 TX → 屏 RX,屏 TX → 主控 RX,共地;本交接未核实连接器针脚和电平 | ## 3. 最小可用示例 以下三条依次设置配电箱正常、左急停/行程/惯性故障,再进入 debug 页面。仅发送指令本身,每条追加结束符。 ```text d0=1 d1=2 page debug ``` 发送 d0=1 的完整字节:64 30 3D 31 FF FF FF(7 字节)。连续发送多条时,每条都要独立追加结束符,串口队列不得让不同任务的字节交错。 --- # 4. Debug 状态编号 主控发送 dN=V;N 为下表编号,V 只能取 0、1、2。默认全部为 0。下表顺序是工程中的接口映射,不是电气线束针脚顺序。 | 变量 | 原始信号名 | 检测内容 | | --- | --- | --- | | d0 | Safe_DBBox_OUT | 配电箱安全回路 | | d1 | Safe_L&BOTS&IW | 左急停、超行程和惯性开关 | | d2 | Safe_Ba_BOX | 电池箱安全回路 | | d3 | Safe_RSTOP | 右急停和驾驶舱急停 | | d4 | Safe_LAST | 安全回路末端 | | d5 | Safe_S | 左右后悬安全回路 | | d6 | Safe_RES1 | RES 安全回路 | | d7 | Safe_Control | 主控盒安全回路 | | d8 | EBS_BE | 制动舵机电源 | | d9 | EBS_12V | 电磁阀电源 | | d10 | EBS_AIR | 气压传感器电源 | | d11 | EBS_Oil | 油压传感器电源 | | d12 | Driverless_INS | 惯导电源 | | d13 | Driverless_WSS | 轮速传感器电源 | | d14 | Driverless_Camera | 摄像头电源 | | d15 | 12V_Control | 主控盒供电 | ## 显示与生命周期 0 → 灰色“未知”(33840);1 → 绿色“正常”(2016);2 → 红色“故障”(63488)。其他数值显示未知,但主控应限制为 0~2。颜色由工程脚本处理。 d1 同时更新左急停及行程/惯性两个位置;一次发送即可同步。后悬、RES、主控盒在原图中未标出接入点,独立显示;连线表示原图的示意顺序,不能据此推断具体断点。 d0~d15 为全局变量,任何页面均可更新,切页保留,断电重置。debug 后初始化立即绘制状态,tm0 每 250 ms 刷新;离开 debug 后定时器停止,但全局变量仍可接收更新。 通讯断线不会自动恢复未知。主控或通讯管理层应在数据超时后将相应 dN 清为 0;建议仅发送变化项,并按项目周期补发完整状态。旧的 debug.tN.txt/pco 赋值会被定时器覆盖,接手代码应改为 dN=V。 --- # 5. 任务选择回传 方向:屏幕 → 主控。用户点击主页面左侧按钮后进入 CONFIRM,显示所选任务。点击“确认发送”输出下表帧并返回 dash;点击“取消返回”不输出任务帧。 | 编号 NN | 任务 | 完整帧(十六进制) | | --- | --- | --- | | 01 | 八字绕环 | AA 55 01 01 0D 0A | | 02 | 直线加速 | AA 55 01 02 0D 0A | | 03 | 高速循迹 | AA 55 01 03 0D 0A | | 04 | 车检测试 | AA 55 01 04 0D 0A | | 05 | EBS 测试 | AA 55 01 05 0D 0A | | 06 | 手动驾驶 | AA 55 01 06 0D 0A | | 偏移 | 字节 | 含义 | | --- | --- | --- | | 0~1 | AA 55 | 帧头 | | 2 | 01 | 任务选择消息类型 | | 3 | 01~06 | 任务编号,单字节二进制 | | 4~5 | 0D 0A | 固定帧尾 | ## 主控接收与处理 按连续字节流解析,不能假定一次 UART/DMA 回调正好收到一帧。维护接收缓冲,搜索 AA 55,等待至少 6 字节,检查类型=01、编号=1~6、帧尾=0D 0A。合法则交给任务状态机并消费 6 字节;非法则丢弃首字节重新搜索。 当前帧没有长度字段、序列号、校验和或 CRC;屏幕也没有 ACK 等待、自动重发机制。主控自行决定忙碌时如何处理新任务和重复请求。确认发送后,仪表仅把“当前任务”更新为用户选择,不证明主控已接受或车辆正在执行。 ## 上电与其他返回帧 Program.s 上电通过 printh 发出 00 00 00 FF FF FF 88 FF FF FF。该启动数据不是任务指令。屏幕还可能输出官方错误、查询结果等返回数据,接收层要与任务帧区分。 联调可发送 bkcmd=3(同样加 FF FF FF)打开成功/失败反馈。官方执行成功码为 01 FF FF FF,变量名称无效为 1A FF FF FF。反馈是屏幕执行文本指令的结果,不是任务执行 ACK。当前工程未主动设置 bkcmd,不应以“没有成功返回”判断命令失败。 --- # 6. 主页面与页面切换 主页面数字控件已设为全局,可通过带页面名的属性指令跨页更新。新增 lvbat 是两位小数的虚拟浮点控件,val 单位固定为 0.01 V;其他原有数值仍为整数显示。所有 val 指令都发送整数。 | 显示项 | 赋值命令示例 | 说明 | | --- | --- | --- | | 低压电池电压 | dash.lvbat.val=1260 | 0.01 V/计数;显示 12.60 V | | 当前车速 | dash.speed.val=30 | 界面标注 km/h;示例显示 30 | | 高压电压 | dash.ts.val=300 | 整数 V;BMS 原始 0.1 V 四舍五入 | | 扭矩千分 | dash.mct.val=500 | 保留界面“扭矩千分”定义 | | 高压电流 | dash.dl.val=20 | 整数 A;BMS 原始偏置 uint16 换算后四舍五入 | | 电机温度 | dash.djwd.val=45 | 控件支持整数 ℃;当前 MCU 无来源,保持无效 | | MCU 温度 | dash.mcuwd.val=40 | 控件支持整数 ℃;当前 MCU 无来源,保持无效 | | 最高单体 | dash.dtwd.val=50 | BMS 最高有效实际温度,整数 ℃ | 低压电池电压放在车速上方,保留两位小数。主控若采集为 mV,应先换算为 0.01 V 整数(例如 12600 mV → 1260)。指令 dash.lvbat.val=1260 后仍追加 FF FF FF。该值为全局,切页保留,上电设计初值 0.00 V;初值和断线后的旧值不代表有效测量,也没有自动低压告警。 数值 val 按有符号 32 位整数使用。当前 CAN 来源、单位、缩放、独立超时和有效颜色已在 [AMI_CAN_DBC说明.md](AMI_CAN_DBC说明.md) 定义。车速、扭矩、电机/逆变器温度尚缺来源或标定,不能把示例值当作测量结果。 ## 页面指令 ```text page dash page debug ``` 每条后加 FF FF FF。页面 ID:dash=0、debug=1、CONFIRM=2。优先用页面名,不依赖页面顺序。CONFIRM 应由六个任务按钮进入,避免未设置 pending_task 时直接进入。 隐藏入口:dash 右上角 x=440,y=0,w=40,h=25;debug 右上角“返回”切回 dash。调试页状态是显示功能,不输出 ECU/继电器动作指令。 ## 其他文本与安全动作 dash 的 sd(锁定显示)、EBS 文本为私有控件;只在 dash 当前显示时用 sd.txt="已锁定" 或 EBS.txt="EBS 正常" 更新,中文需 GB2312。切页后会恢复设计初值。debug 的 d8 不会自动驱动主页面 EBS 文本。 按用户提供的状态表:EBS 舵机、电磁阀、气压、油压检测故障时的 VCU 通知、EBS 灯供地及 ECUBACK 断开,由主控实现;无人驾驶 INS/WSS/Camera 故障的 VCU 通知与 ECUBACK 断开也由主控实现,其 EBS 灯逻辑与前四项不同。屏幕工程不包含这些安全输出,也不把检测电平自动解释为正常/故障。 --- # 7. 主控发送参考与验收 以下 C 示例一次提交整条消息,防止命令与结束符被交错。UART_SendBytes 是待接入的驱动接口;必须在返回前完成发送或复制数据,异步 DMA 不能继续引用函数栈缓冲。 ```text #include #include #include extern void UART_SendBytes(const uint8_t *data, size_t len); int ami_set_debug(unsigned id, unsigned state) { uint8_t buf[24]; if (id > 15 || state > 2) return -1; int n = snprintf((char *)buf, sizeof buf, "d%u=%u", id, state); if (n < 0 || (size_t)n > sizeof buf - 4) return -1; buf[n++] = 0xFF; buf[n++] = 0xFF; buf[n++] = 0xFF; UART_SendBytes(buf, (size_t)n); return 0; } ``` ## 联调验收顺序 ① 下载配套 AMI.HMI 编译生成的屏幕资源;将 UART 参数、电平和接线与实际型号核对。② 在 dash 页面发送 d0=1、d1=2,打开隐藏入口,应见配电箱绿正常、左急停和行程/惯性同时红故障。③ debug 内发送 d0=2、d1=1,应在约 250 ms 刷新周期内变色;发送 d0=0 应恢复灰未知。 ④ 离开再进入 debug,状态应保留;断电重启应全为未知。⑤ 六个任务逐项确认并记录实际收到的 6 字节帧;逐项取消应无新增任务帧。⑥ 主控接收测试覆盖拆帧、粘帧、启动数据及非法编号。⑦ 单独验证安全逻辑,不能以仪表显示替代主控/执行器测试。 ## 已完成与待验证 已完成:USART HMI 编译 0 错误、0 警告;模拟器验证跨页数值更新、正常/故障/未知转换,以及 d1 双位置同步;新增 lvbat 已验证 1260 显示 12.60 V、跨页更新 1185 显示 11.85 V。六个任务回传此前已做模拟检查。2026-10-03 已通过实物 CAN1 / MCU / USART2 / COM4 到官方 HMI 调试器联调,含六个任务确认/取消、失效和恢复。待完成:物理屏幕下载、实物触摸与完整时延、CAN2 接线和车辆安全动作。C 示例仅为驱动接入参考,本次未在目标主控工程中编译。 ## 8. 工程版本与资料 配套 AMI.HMI 的 SHA-256: 8a37e4961f90671f04e55ba94c173ae8fbfc5e30c2a3e74a2c37148157c3d16d 旧版工程不能与本版 dN 接口混用。配套文件包括 AMI.HMI、AMI.dbc、DBC 说明、通讯交接文档.md 和 ami_debug_send.c;旧 PDF 保留为 v1.2 历史资料,其中 Markdown 为可编辑文字源,C 文件为参考发送函数。仓库中的实际位置见 README。 官方协议依据:wiki.tjc1688.com/commands/index.html;wiki.tjc1688.com/return/index.html;wiki.tjc1688.com/variables/bkcmd.html。项目自定义任务帧和 dN 编号以本文及配套工程为准。