最近研究了一下廉价CAN分析设备的原理,顺便明白了和CAN-OE设备的差距真的是天上地下.不过存在着不少优点还是可以学习的.下面是商品链接:
https://www.can232.com/

从名字上就可以看出这是一个串口到can数据包的转换工具,但是搜索很久都没找到通信协议,插在电脑上也不会主动发送消息,正在我百思不得其解的时候,发现了Linux内核里面有个叫做slcan
的驱动模块,里面写着CAN232设备的网址.于是先调查下slcan是个什么东西.
slcan
全名 serial line CAN interface driver ,正好是CAN232设备的支持模块,需要配合slcand
来使用(位于can=utils程序中).
初始化slcan很简单,正常初始化即可,但是如果我们把CAN232换成普通串口进行抓包,也是可以初始化的o.o
因此在打开设备时候可以捕获到下面数据(结尾均为0x0d,即’\r’):
C
S6
F
O
根据slcand的代码,可以判断相应字母(区分大小写)的意思,每个命令0x0d结尾
C -> 关闭 S6 -> 速度500k (参考: https://elinux.org/Bringing_CAN_interface_up#SLCAN_based_Interfaces) F -> 获取状态 O -> 打开设备 // 下面这些也是代码中描述的协议 L -> 只听模式 s -> 设置波特率 //数据报文(大写代表扩展帧,小写代表数据帧) t 数据帧 r 远程帧 //回复结尾 0x0d 正常 异常(我忘了o.o,回头再试一下) z 发送成功
因此,随便一个串口只要按照上面格式发送数据就可以被linux转换为CAN消息.当然这样的协议存在明显的缺点,即抗干扰能力差(不过CAN232采用了FTDI的串口芯片,一般实验室情况下稳定性足够了).
最后补上一张串口助手模拟的CAN.

slcanfd
这个串口模块非常古老,因此不支持CAN-FD的协议,但是内核驱动写的很清晰易懂,配合虚拟串口回环和cangen
工具,制作了一个支持CAN-FD的驱动https://github.com/feilongfl/slcanfd.
首先模块名字改成了slcanfd,编译安装并手动加载即可使用slcand进行启动.(注意卸载slcan模块,否则会冲突)
后续可以考虑修改下slcand工具,增加下数据速度设置.在stm32G431上配合usb cdc跟fdcan做个usbcanfd(淘宝好像也有现成的,不过我想玩玩画板子,4层板都快成白菜价了)
发送接收展示:





顺便wakatime也挺好玩的,能看到调查这堆东西花了多少时间:
