用 Cursor 完成储能 CAN 数据下发需求开发实录
本文记录了使用 Cursor AI 编程工具,从需求描述到代码落地,完整实现 AFE 重置与 BSU 复位两项 CAN 下发功能的全过程。 目录 / Contents
01
Cursor 是什么?
AI 编程如今已不是新鲜事,当前的 AI 编程工具已能承担相当一部分基础开发工作。Cursor 是一款基于 VS Code 构建的 AI 编程工具,它与 ChatGPT 等问答式工具的最大区别在于:它能完整解析整个工程项目文件结构,而不是依赖手动喂入片段代码。
只需用自然语言描述需求,Cursor 便能结合项目上下文生成可用代码,几乎不需要人工修改。对于长期使用 VS Code 的工程师来说,上手成本极低。
💡Cursor 的核心优势:全工程上下文理解 + VS Code 生态兼容,让 AI 真正"理解"你的项目,而不只是回答孤立的问题。
02
需求背景与功能说明
本次开发的背景来自储能系统中的电池安全状态管理。当通过云平台检测到某个电芯进入 Safe 状态时,需要远程对对应的 BSU(电池采样单元)下发 AFE 重置及 BSU 复位命令,操作顺序如下:
CAN 协议说明
以第 3 个 PACK 为例:
AFE 重置报文
MU2 下发(CAN ID: 0x0556325a) C1 1F 01 03 00 00 00 00 # BSU 在 CAN2 上响应(CAN ID: 0x0556ff32) C3 0A 03 00 01 00 00 00 # → 第 3 个 BSU 进入 AFE 重置状态
BSU 复位报文(AFE 重置完成后执行)
MU2 下发(CAN ID: 0x0556325a) C1 20 01 03 00 00 00 00 # BSU 在 CAN2 上响应(CAN ID: 0x0556ff32) C3 0B 03 00 01 00 00 00 # → 第 3 个 BSU 进入复位状态
开发目标
在本地 Web 监控端,新增可输入数值的交互控件,分别用于下发 AFE 重置和 BSU 复位命令。根据输入的 PACK 编号(1~5),下发对应 PACK 的重置指令。控件位置:BMS → 电池组-1。
03
第一轮:提交需求与 Cursor 实现
向 Cursor 提交的指令
PROMPT · 第一轮需求描述
我现在要开发 AFE 重置功能和 BSU 重置功能,请你分析 System.sql 文件,以及 st_batt_sampler 文件夹下的文件。具体需求是:这两个重置功能使用监控通过 CAN 下发,位置放在 Web_MainIdx 表下的"BMS"下的 Web_SubIdx 表的"电池组-1"下面,以可以输入编辑的样式,数值范围 1~5,请你根据新加的协议和所需功能完成开发。
Cursor 的实现内容
Cursor 分析了 System.sql 及 st_batt_sampler 目录后,自动完成了以下四部分修改:
st_batt_sampler.h
新增枚举常量 CTRL_STBATT_AFE_RESET、CTRL_STBATT_BSU_RESET
can_infy_batt.h
新增 CAN 命令常量 CAN_S_CMD_C2S_AFE_RESET、CAN_S_CMD_C2S_BSU_RESET
can_infy_batt.c
实现打包函数 YFY_PackC2S_AfeReset_CtrlCmd 和 YFY_PackC2S_BsuReset_CtrlCmd, 报文格式分别为 C1 1F 01 [PACK] 00 00 00 00 与 C1 20 01 [PACK] 00 00 00 00; 并在 YFY_Send_C2S_Status 及 YFY_Batt_Control 中完成命令分发。
System.sql
在 Charger_DeviceModel_ControlParameters 表新增参数 545(AFE Reset)和 546(BSU Reset), 挂载至 Web_Main=3(BMS)、Web_Sub=42(电池组-1);Resources 表新增对应中英文资源字符串。
⚠️此时 Cursor 将参数类型设为了 ENUM(枚举选择),而非可手动输入的数字框,需要进一步修正。
04
第二轮:细化需求与修正交互逻辑
补充说明与修正指令
PROMPT · 第二轮修正需求
现在的需求是,frm.byData[3] 这个位置的值由网页端输入的数值决定(范围 15,表示第 15 个 PACK)。请将 545 和 546 的参数类型由 ENUM 改为 UINT,范围 1/5,改为可编辑输入框样式。当 AFE 输入框输入 3 时,CAN 下发:C1 1F 01 03 00 00 00 00;当 BSU 重置输入 4 时,CAN 下发:C1 20 01 04 00 00 00 00。
Cursor 的修正结果
System.sql
545 / 546 参数:Value_Type 由 'ENUM' 改为 'UINT', Value_Range 改为 '1/5',网页端渲染为可编辑数字输入框。
st_batt_sampler.c
参数 545:读取网页输入值 nPackNum = (int)pVarVal->ulValue, 校验范围后调用 Send_Ctrl_STBatt(..., CTRL_STBATT_AFE_RESET, nPackNum - 1); 参数 546 逻辑相同,命令改为 CTRL_STBATT_BSU_RESET。
最终行为验证
| 操作 | 网页输入 | 内部 nBattIdx | CAN 报文(byData) |
|---|---|---|---|
| AFE 重置 | 3 | 2 | C1 1F 01 03 00 00 00 00 |
| BSU 复位 | 4 | 3 | C1 20 01 04 00 00 00 00 |
注:网页输入值 N,对应 nBattIdx = N - 1,CAN 报文 byData[3] = N,与协议文档一致。
05
总结
开发验证结论
Cursor 根据自然语言需求输出的代码,经过编译与实际运行验证,功能完全正常,无需人工大幅修改。
整个过程分为两轮对话:第一轮完成核心功能框架搭建,第二轮针对交互细节进行精确修正。整体效率相比传统开发方式有显著提升。
使用建议
对于简单的业务需求,可以直接交给 Cursor 完成;对于较复杂的开发任务,也可以借助 Cursor 梳理思路、分析解决方案。合理结合 AI 工具,不仅能大幅提升工作效率,也能在对比中发现和补齐自身的认知盲区。