离线批量执行

离线批量执行可以把一组 CAN 或 RS485 指令保存到开发板,并按设定的顺序、间隔和次数自动发送。保存完成后,不需要电脑持续发送数据,重新上电也可以自动运行。

建议使用 V47 或更新的 V4 固件。使用串口工具发送本页命令时,请选择开发板对应的 USB 串口,按文本发送,并将结束符设置为 CRLF。每条设置命令成功后都会返回 OK

如需通过图形界面创建和调试批次,也可以使用 SANPO Studio

使用前准备

一个 USB 串口只控制当前 STM32 对应的两路 CAN 和两路 RS485。命令中的 Channel 按以下规则选择本地接口:

Channel

当前 USB 串口对应的发送目标

13

第一路 CAN 或 RS485

24

第二路 CAN 或 RS485

0

同时发送到当前串口对应的两路接口

例如,连接控制 CAN-1/2 和 RS485-1/2 的 USB 串口时,建议使用 Channel 12;连接另一颗 STM32 的 USB 串口时,建议使用 Channel 34

先确认总线通信参数与设备一致:

AT+SETCAN=1000000
AT+SETRS485=4000000,1,0,8

CAN 支持 1000001250002500005000001000000 bit/s。RS485 参数的设置方法请参考 RS485 原始数据透传。这些设置会保存到开发板,重新上电后仍然有效。

快速创建一个批次

下面的示例创建批次 1,依次发送一条 CAN 扩展帧和一条 RS485 指令。

  1. 开始创建批次:

    AT+BATBEGIN=1,motor_test
    
  2. 添加第 1 条指令:向第一路 CAN 发送扩展帧 ID 0x123、8 字节数据,发送后等待 20 ms:

    AT+BATADD=1,1,2,1,20,00000123081122334455667788
    
  3. 添加第 2 条指令:向第二路 RS485 发送 17 字节数据,发送后等待 10 ms:

    AT+BATADD=1,2,3,2,10,FEEE11000000000000000000000000187C
    
  4. 保存批次:

    AT+BATCOMMIT=1
    
  5. 只运行一次:

    AT+BATRUN=1,1,0,1
    

首次测试建议先使用单次运行,并保证电机周围没有人员和障碍物。确认每条指令都正确后,再使用周期运行或上电自动运行。

添加指令时各字段的含义

AT+BATADD=<批次编号>,<序号>,<协议>,<Channel>,<等待时间>,<十六进制数据>

字段

说明

批次编号

199

序号

1 开始,必须连续增加

协议

1:CAN 标准帧;2:CAN 扩展帧;3:RS485

Channel

04,路由规则见“使用前准备”

等待时间

当前指令发送完成后,到下一条指令开始前的等待时间,范围 09999 ms

十六进制数据

不带空格,每两个字符表示一个字节,最长 60 字节

批次名称可使用英文字母、数字、下划线和中划线,长度为 1~16 个字符。开始创建同一编号的新批次并提交后,会覆盖该编号原来的有效内容。

CAN 数据格式

CAN 标准帧的十六进制数据格式为:

CAN_ID(2 字节,高字节在前)+ DLC(1 字节)+ DATA(0~8 字节)

CAN 扩展帧的格式为:

CAN_ID(4 字节,高字节在前)+ DLC(1 字节)+ DATA(0~8 字节)

DLC 必须与后面的 DATA 字节数一致。RS485 直接填写设备厂家定义的原始指令,单条最长 60 字节。

运行、停止和查询

AT+BATRUN=<批次编号>,<模式>,<周期间隔>,<循环次数>

参数

说明

模式 1

批次只执行一次;建议周期间隔填写 0

模式 2

周期执行;每条指令的等待时间都生效,一轮结束后再增加周期间隔,然后开始下一轮

周期间隔

065535 ms

循环次数

周期模式的完整执行轮数;0 表示一直运行,直到收到停止命令或断电

例如,每 100 ms 进入下一轮,共运行 10 轮:

AT+BATRUN=1,2,100,10

停止当前批次:

AT+BATSTOP

查询运行状态:

AT+BATSTAT?

返回示例:

BATSTAT:run=1,batch_id=1,mode=2,idx=2,count=2,repeat_cfg=10,repeat_done=3,last_err=0,tx_ok=7,tx_fail=0

常用字段中,run=1 表示正在运行,idx 表示下一条待执行指令,repeat_done 表示已完成轮数,last_err=0tx_fail=0 表示当前没有发送错误。

查看和删除已保存批次

查询批次列表:

AT+BATLIST?

返回示例:

BATLIST:1,motor_test;2,stand_test

没有已保存批次时返回:

BATLIST:NONE

查看批次摘要和单条指令:

AT+BATREAD=1,0
AT+BATREAD=1,1

返回示例:

BATREAD:id=1,name=motor_test,count=2
BATREAD:id=1,idx=1,proto=2,ch=1,delay_ms=20,payload=00000123081122334455667788

删除指定批次:

AT+BATDEL=1

清空全部批次:

AT+BATERASE

AT+BATERASE 只清空离线批次区域,但删除后无法恢复,正常使用时不需要频繁执行。

设置上电自动运行

先确认批次已经保存且手动运行正常,再设置上电自动运行。

周期运行批次 1,每轮间隔 200 ms,共运行 2 轮:

AT+BATAUTOSET=1,2,200,2

上电后只运行一次:

AT+BATAUTOSET=1,1,0,0

查询当前设置:

AT+BATAUTO?

返回示例:

BATAUTO:ID=1,MODE=2,PERIOD=200,REPEAT=2

取消上电自动运行:

AT+BATAUTOCLR

如果自动运行所引用的批次已被删除,开发板会正常启动,但不会执行该批次。建议删除批次前先取消对应的自动运行设置。

分片添加较长指令

AT+BATADD 已支持最长 60 字节。只有当串口工具无法一次发送较长命令时,才需要使用分片方式:

AT+BATADDX=<批次编号>,<序号>,<协议>,<Channel>,<等待时间>,<总长度>,<分片序号>,<字节偏移>,<分片数据>
AT+BATADDEND=<批次编号>,<序号>,<CRC16>

分片序号从 1 开始,字节偏移从 0 开始,必须连续上传。CRC 使用 CRC-CCITT 的反射算法,初始值为 0x0000,多项式为 0x8408,对完整原始数据计算。

以下示例上传一条 40 字节 RS485 指令,正确 CRC 为 EFCE

AT+BATBEGIN=2,long_rs485
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,EFCE
AT+BATCOMMIT=2

错误返回

命令失败时返回 ERR,<编号>

返回

常见原因和处理方法

ERR,1

参数格式错误;检查逗号、十六进制字符、协议和通信参数

ERR,2

操作顺序错误;重新执行 AT+BATBEGIN,并从序号 1 连续添加

ERR,3

编号、长度、等待时间或其他参数超出范围

ERR,4

分片数据 CRC 不一致;重新计算完整数据的 CRC

ERR,5

保存空间不足;删除不需要的批次后重试

ERR,6

找不到指定批次或指令

ERR,7

发送队列暂时忙;降低执行频率或稍后重试

ERR,8

存储读写失败;重新上电后再试,仍失败时联系技术支持