CAN总线是成熟可靠的现场总线,应用极为广泛,如汽车、自动化控制、智能模块等。
为更好地开发和测试CAN总线产品,工程师需要配备顺手的调试分析工具,市面上这类产品很多,从低端到高端都有,但普遍缺乏一项功能:自定义脚本编程控制。
下面介绍的这款调试器Shell Lab C1可以解决这个痛点,不仅可以用Python脚本实时抓取数据包并解析,还能借助Shell Lab测试台软件的优势,将解析出的信号量绘制成实时图表,并且在同一脚本控制多个设备/仪器,搭建一个联动的测控系统。
这是一款基于MCUSH平台开发的工具,插上USB会枚举出虚拟串口(全速,不受设置的波特率限制),串口控制台中增加了一条can指令,所有的操作都是通过这条指令解析,然后用Python库对命令做了抽象封装。
先看看手动调试时底层的can命令参数列表:
=>can --help
usage: can [-c <command>] [-i <index>] [-v <value>] [-e] [-r] <data>
options:
-c/--cmd info|(de)init|reset|baudrate|reset_input|read|write|filter
-i/--idx index param
-v/--val value param
-e/--ext extended
-r/--rtr remote
data data args
=>
上电后默认以1M波特率运行,可调范围包含了从5k~1M的常用值,下面的指令调整波特率至500k:
=>can -c baudrate -v 500000
=>
试着向总线上发送一条报文,11位标识符0xA0,数据共3字节(0x01、0x02和0x03),指令如下:
=>can -c write -i 0xA0 0x01 0x02 0x03
=>
取出总线上收到的报文,将接收缓冲逐行打印出来:
=>can -c read
0B0 D 01020304
...
=>
第一条表示标识符0x0B0的数据帧,内容共4字节(0x01、0x02、0x03和0x04)。
以上只是简单功能的示例,更复杂的控制指令还包括:
- 扩展帧和远程帧的控制
- 硬件标识符滤波器的设置
都是通过can指令完成,细节不展开介绍了,有兴趣的话可以自行尝试。
下面引入更实用的MCUSH/Python库,已将上面所有细节都封装完成方便调用。
将上面的的发送接收过程用Python脚本再实现一遍:
from
其中canWrite写函数传入目标标识符,数据列表(整数,最多8字节),若需要扩展帧标志则加上参数ext=True,远程帧标志则加参数rtr=True。
canRead读函数返回的报文列表中,每一项都是包含标识符、扩展帧标志、远程帧标志和内容的四元组,内容类型为最长8字节的字符串,通过hexlify函数转换后打印出来。
至此已经可以用Python控制CAN总线,写命令行方式的测试用例了,但是工具的优化还没结束,下面引入Shell Lab测试台软件,看看自带的示例代码:
点击“加载示例”->“can”->“packets logger”,这是一个报文记录的脚本。
代码首先设置硬件标识符滤波器,只监听总线上感兴趣的内容(默认监听所有),并按CSV格式记录成文件(可用EXCEL打开),非常实用。也是一个模板,加以改造:对收到数据解析,取出需要的信息(也许是物理量、状态量、过程控制反馈等),进一步地将这些物理量在绘图面板中描绘出来,实现数据的可视化。
例如,下图是某车辆(长城H6车型)OBD接口记录下的原始数据(暂时没找到报文协议没法解读):
下一个示例“can”->“ send random packets”:
这个脚本会挑选随机标识符,发送随机数据(包括内容和长度),标准/扩展/远程帧类型也随机,是个颇具“破坏性”的程序,改造一下,可用于产品开发时的压力测试。
注:
Shell Lab测试台软件免费使用,下载地址:http://www.linkongsoft.com/shell-lab/
mcush库安装方式:sudo pip install mcush