离线批量执行
离线批量执行可以把一组 CAN 或 RS485 指令保存到开发板,并按设定的顺序、间隔和次数自动发送。保存完成后,不需要电脑持续发送数据,重新上电也可以自动运行。
建议使用 V47 或更新的 V4 固件。使用串口工具发送本页命令时,请选择开发板对应的 USB 串口,按文本发送,并将结束符设置为 CRLF。每条设置命令成功后都会返回 OK。
如需通过图形界面创建和调试批次,也可以使用 SANPO Studio。
使用前准备
一个 USB 串口只控制当前 STM32 对应的两路 CAN 和两路 RS485。命令中的 Channel 按以下规则选择本地接口:
Channel |
当前 USB 串口对应的发送目标 |
|---|---|
|
第一路 CAN 或 RS485 |
|
第二路 CAN 或 RS485 |
|
同时发送到当前串口对应的两路接口 |
例如,连接控制 CAN-1/2 和 RS485-1/2 的 USB 串口时,建议使用 Channel 1、2;连接另一颗 STM32 的 USB 串口时,建议使用 Channel 3、4。
先确认总线通信参数与设备一致:
AT+SETCAN=1000000
AT+SETRS485=4000000,1,0,8
CAN 支持 100000、125000、250000、500000 和 1000000 bit/s。RS485 参数的设置方法请参考 RS485 原始数据透传。这些设置会保存到开发板,重新上电后仍然有效。
快速创建一个批次
下面的示例创建批次 1,依次发送一条 CAN 扩展帧和一条 RS485 指令。
开始创建批次:
AT+BATBEGIN=1,motor_test
添加第 1 条指令:向第一路 CAN 发送扩展帧 ID
0x123、8 字节数据,发送后等待 20 ms:AT+BATADD=1,1,2,1,20,00000123081122334455667788
添加第 2 条指令:向第二路 RS485 发送 17 字节数据,发送后等待 10 ms:
AT+BATADD=1,2,3,2,10,FEEE11000000000000000000000000187C
保存批次:
AT+BATCOMMIT=1
只运行一次:
AT+BATRUN=1,1,0,1
首次测试建议先使用单次运行,并保证电机周围没有人员和障碍物。确认每条指令都正确后,再使用周期运行或上电自动运行。
添加指令时各字段的含义
AT+BATADD=<批次编号>,<序号>,<协议>,<Channel>,<等待时间>,<十六进制数据>
字段 |
说明 |
|---|---|
批次编号 |
|
序号 |
从 |
协议 |
|
Channel |
|
等待时间 |
当前指令发送完成后,到下一条指令开始前的等待时间,范围 |
十六进制数据 |
不带空格,每两个字符表示一个字节,最长 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=<批次编号>,<模式>,<周期间隔>,<循环次数>
参数 |
说明 |
|---|---|
模式 |
批次只执行一次;建议周期间隔填写 |
模式 |
周期执行;每条指令的等待时间都生效,一轮结束后再增加周期间隔,然后开始下一轮 |
周期间隔 |
|
循环次数 |
周期模式的完整执行轮数; |
例如,每 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=0 和 tx_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,<编号>:
返回 |
常见原因和处理方法 |
|---|---|
|
参数格式错误;检查逗号、十六进制字符、协议和通信参数 |
|
操作顺序错误;重新执行 |
|
编号、长度、等待时间或其他参数超出范围 |
|
分片数据 CRC 不一致;重新计算完整数据的 CRC |
|
保存空间不足;删除不需要的批次后重试 |
|
找不到指定批次或指令 |
|
发送队列暂时忙;降低执行频率或稍后重试 |
|
存储读写失败;重新上电后再试,仍失败时联系技术支持 |