# 开发板可编程功能(批量指令离线自动执行) > 用于在开发板本地存储一批 CAN/RS485 指令,并按预设周期和次数自动执行。 > 快速集成可使用 [SANPO Studio 工具](https://sanporobot.com/sanpo-studio) 进行批量 CAN/RS485 指令调试、存储和自动执行配置。 - 所有 `AT+` 命令均需以 `\r\n` 结尾。 - 该功能仅适用于固件 `V4.2` 及以后版本。 - 发送 `AT+VER`(以\r\n结尾) 查询固件版本;如未返回 `V42` 版本号,请更新到[最新固件](https://gitcode.com/sanpo/robot/tree/v4/firmware/sanpo_spine)。 ## 命令总览 | 指令 | 说明 | | --- | --- | | `AT+BATBEGIN=,` | 创建/覆盖一个批次,开始上传该批次指令 | | `AT+BATADD=,,,,,` | 添加单条指令(短 payload) | | `AT+BATADDX=,,,,,,,,` | 添加分片指令(长 payload) | | `AT+BATADDEND=,,` | 结束分片上传并校验 | | `AT+BATCOMMIT=` | 提交并持久化批次 | | `AT+BATRUN=,,,` | 运行批次(`1=ONCE`, `2=PERIODIC`) | | `AT+BATSTOP` | 停止当前运行 | | `AT+BATLIST?` | 查询批次列表 | | `AT+BATREAD=,` | 回读批次条目;`idx=0` 返回摘要 | | `AT+BATDEL=` | 删除批次 | | `AT+BATSTAT?` | 查询运行状态 | | `AT+BATAUTOSET=,,,` | 设置上电自动执行 | | `AT+BATAUTOCLR` | 清除上电自动执行配置 | | `AT+BATAUTO?` | 查询上电自动执行配置 | | `AT+BATERASE` | 硬擦除整个 BATCH 存储区域(不可频繁使用) | ## 全局通信参数(持久化) 为支持开发板离线批量执行,建议先配置全局 CAN/RS485 参数: - `AT+SETCAN=`:设置全局 CAN 波特率(当前开发板上的 CAN 通道统一生效)。 - `AT+SETRS485=,,,`:设置全局 RS485 参数(当前开发板上的 RS485 通道统一生效)。 字段说明: - `baud`:波特率(示例:CAN `1000000/500000/250000/125000`,RS485 `4000000` 等) - `stop`:停止位,`1` 或 `2` - `parity`:校验位,`0=None`、`1=Odd`、`2=Even` - `bits`:数据位,`8` 或 `9` 持久化规则: - 开发板重新上电后将自动加载并应用上次保存的参数。 示例: ```bash AT+SETCAN=1000000 AT+SETRS485=4000000,1,0,8 ``` ## 字段定义 - `id`:批次编号,范围 `1..99` - `name`:批次名称(英文/数字/下划线/中划线),最大 `16` 字符 - `idx`:批次内指令索引,从 `1` 开始,必须连续递增 - `proto`:`1=CAN_STD`, `2=CAN_EXT`, `3=RS485` - `ch`:通道 `1..4`(`0` 表示广播) - `delay_ms`:指令间相对延时,范围 `0..9999` ms - `hex_payload/hex_part`:十六进制文本(2 字符 = 1 字节) - `mode`:`1=ONCE`, `2=PERIODIC` - `repeat`:循环次数,`0` 表示无限循环 - `seq`:分片序号,从 `1` 开始递增 - `off`:分片偏移(字节),从 `0` 开始 ## Payload 编码定义 - `payload` 使用十六进制文本编码(2 字符 = 1 字节) - `proto=1 (CAN_STD)`:`CANID(2B) + DLC(1B) + DATA(0~8B)`,总长度 `3~11B` - `proto=2 (CAN_EXT)`:`CANID(4B) + DLC(1B) + DATA(0~8B)`,总长度 `5~13B` - `proto=3 (RS485)`:单条 RS485 数据 `<=17B` 可用 `AT+BATADD`,更长请用 `AT+BATADDX` - 示例(CAN_EXT):`00000123081122334455667788` - 示例(RS485):`A55A010203040506` ## 长度与分片规则 - `AT+BATADD` 适合短 payload(`<=17` 字节) - 长 payload 使用 `AT+BATADDX + AT+BATADDEND` 分片上传 ## 使用样例 1. 创建批次 ```bash AT+BATBEGIN=1,walk_cycle ``` 2. 添加 CAN_EXT 条目 ```bash AT+BATADD=1,1,2,1,20,00000123081122334455667788 ``` 3. 添加 RS485 条目 ```bash AT+BATADD=1,2,3,2,10,A55A010203040506 ``` 4. 提交并运行(周期 100 ms,持续循环) ```bash AT+BATCOMMIT=1 AT+BATRUN=1,2,100,0 ``` 5. 停止运行 ```bash AT+BATSTOP ``` 6. 分片示例(40 字节 RS485) ```bash AT+BATADDX=2,1,3,2,20,40,1,0,11223344556677889900AABBCCDDEEFF AT+BATADDX=2,1,3,2,20,40,2,16,0102030405060708090A0B0C0D0E0F10 AT+BATADDX=2,1,3,2,20,40,3,32,1112131415161718 AT+BATADDEND=2,1,7A3C AT+BATCOMMIT=2 ``` 7. 查询批次列表 ```bash AT+BATLIST? ``` 返回示例: ```text BATLIST:1,walk_cycle;2,test_rs485 BATLIST:NONE ``` 8. 回读批次内容 ```bash AT+BATREAD=1,0 AT+BATREAD=1,1 AT+BATREAD=1,2 ``` 返回格式: ```text BATREAD:id=,name=,count= BATREAD:id=,idx=,proto=,ch=,delay_ms=,payload= ``` 9. 查询运行状态 ```bash AT+BATSTAT? ``` 10. 删除批次 ```bash AT+BATDEL=1 ``` 11. 配置上电自动执行 ```bash AT+BATAUTOSET=1,2,200,2 AT+BATAUTOSET=1,1,0,0 AT+BATAUTO? AT+BATAUTOCLR ``` 12. 擦除全部 BATCH 存储 ```bash AT+BATERASE ``` ## 错误码 失败返回格式: ```text ERR, ``` 定义如下: - `0`:成功(通常返回 `OK`) - `1`:`BAT_ERR_PARAM`,参数格式错误/缺参数/非法字符 - `2`:`BAT_ERR_STATE`,状态错误(未 `BATBEGIN` 就 `BATADD`、分片顺序错误、`idx` 不连续等) - `3`:`BAT_ERR_RANGE`,参数超范围(`id`/`idx`/`seq`/`delay_ms`/长度等) - `4`:`BAT_ERR_CRC`,`BATADDEND` CRC 校验失败 - `5`:`BAT_ERR_NOSPACE`,Flash 空间不足 - `6`:`BAT_ERR_NOTFOUND`,批次不存在或被删除 - `7`:`BAT_ERR_QUEUE`,发送队列忙(可重试) - `8`:`BAT_ERR_FLASH`,Flash 读写/擦除失败