slcan 协议 脚本 测试

2023-05-16

文章目录

    • slcan 协议
    • kernel slcan
    • can-utils slcanpty
    • can-utils slcand
    • can-utils slcan_attach
    • python slcan

slcan 协议

slcan, 基于文本 ASCII 的协议, 也是 LAWICEL 硬件设备的协议, CAN Tools by LAWICEL 有两种硬件设备:

  • CANUSB: 目前是 2011 年的 Version 1.0D
  • CAN232: 目前是 2023 年的 Version 3.0B

协议有细微差别, 整体不大, 以 CANUSB 为例:

  • 所有命令 \r 结尾, 大小写敏感, 设备一般会返回 信息 或者 状态 ( \r 表示 OK, 或者 \b 表示 ERROR)
  • Sn\r, 设置 Setup 标准 CAN 的位速率, 其中 n 取 0~8, 对应 10,20,50,100,125,250,500,800,1000Kbit/s, 如想设置 500Kbit/s, 只需要通过串口给 slcan 设备发 S6\r 即可, 设备会返回 \r 表示 OK, 或者 \b 表示 ERROR
  • O\r, 打开 Open CAN 通道, 返回值同上
  • C\r, 关闭 Close CAN 通道, 返回值同上
  • tiiildd...\r, 发送标准帧, 如 t0A70\r 表示发送 id 为 0x0A7, 长度为 0 的标准帧, 又比如 t7FF81122334455667788\r 表示发送 id 为 0x7FF, 长度为8, 数据为 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88 的标准帧. 注: CAN接收再通过串口发出来的数据也一样. 返回 z\r 表示 OK, \b表示 ERROR
  • Tiiiiiiiildd..\r, 发送扩展帧, 如 T0C34567F20102\r 表示发送 id 为 0x0C34567F, 长度为2, 数据为 0x01,0x02 的扩展帧返回 Z\r 表示 OK, \b表示 ERROR
  • riiil\r, 发送标准远程帧, 如 r1000\r 表示 发送 0x100 的远程帧, 返回 z\r 表示 OK, \b表示 ERROR
  • Riiiiiiiil\r, 发送扩展远程帧, 如 r1234567F2 表示发送 0x1234567F 且 DLC=2 的 远程帧
  • F\r, 读状态标志 Flags, 返回 Fxx\r 表示 OK, 其中 xx 是2字节, 也就是8个bit, 分别代表 0-接收FIFO满, 1-发送FIFO满, 2-Error Warning, 3-Data Overrun, 4-Not used, 5-Error Passive, 6-Arbitration Lost, 7-Bus Error, 如果 can 通道没有打开, 返回 \b
  • V\r, 查询版本 Version 号, 返回值为 Vxxyy\r, 如 返回 V1013\r 表示硬件版本号1.0, 软件或固件版本号1.3
  • N\r, 查询Serial编号, 如保存在 EEPROM 中的编号, 可用于程序中区分多个slcan设备, 返回值 Nxxxx\r, 如 NA123\r
  • Zn\r, 设置4字节毫秒时间戳, Z0\r为默认值, 关闭时间戳, Z1\r打开时间戳. 如 关闭时间戳为 t10021133\r, 打开时间戳为 t10021133A902\r, 0xA902=43266, 即 时间戳为 43.266s, 为 mcu 打的时间戳
  • 其它命令可参考 CANUSB 和 CAN232 中的手册

slcan 协议的优点是比较直观, 缺点也很明显, ascii 协议 相比 hex协议 太浪费带宽了, 如本来8bit的数据 0x12 需要用两个ascii字符 12 表示, 直接导致了协议膨胀, 但 slcan 在 linux 中支持较早, 也比较完善, 有参考学习和使用的价值

slcan 的代码实现 github 上有一堆, 如latonita/arduino-canbus-monitor, slcanuino/slcan.ino, conroy-cheers/rusty-can, 也有各种MCU的移植实现如 CANable. 此处略.

kernel slcan

slcan 在 Linux 内核源码中的目录为 drivers/net/can/slcan.c, 一般的 Ubuntu 发行版默认已经有了, 像 WSL 这种可以下载 WSL 内核源码后 make menuconfig 手动开启

在这里插入图片描述

slcan 的加载

sudo modprobe can
sudo modprobe can_raw
sudo modprobe slcan

可以管理员运行 powershell, 用 usbipd 把设备连到 WSL 系统

# 查看wsl发行版名称
wsl -l
# 查看设备的BUSID
usbipd list
# 把设备从windows系统连到wsl的发行版, 如
usbipd wsl attach -d Ubuntu --busid 1-14
# 断开设备连接, 重连到windows
usbipd wsl detach --busid 1-14

can-utils slcanpty

linux-can/can-utils 这个用户空间应用直接提供了 slcan_attach, slcand, slcanpty 这几个应用, 这里先介绍 slcanpty, 可以创建一个遵循 slcan 协议的 pty, 把 ascii 数据转给 can 网络接口, 给手头没有 slcan 设备的体验下 slcan 协议. 用法: slcanpty <pty> <can interface> 这里 pty 可以是默认都有的 /dev/ptmx

#!/bin/bash
sudo modprobe can
sudo modprobe can_raw
sudo modprobe vcan
sudo modprobe slcan

sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
sudo slcanpty /dev/ptmx vcan0

运行完最后一行后会打印 open: /dev/ptmx: slave pseudo-terminal is /dev/pts/19 且不退出. 接下来可以用 minicom 来测试一下

sudo minicom -D /dev/pts/19
# 可以 Ctrl+A,Z, 然后E, 打开输入回显 local Echo
# Ctrl+A,Z, 然后A, 打开行反馈 linefeed

测试结果如图

在这里插入图片描述

时间戳的测试

在这里插入图片描述

can-utils slcand

假设有 slcan 的真家伙, 就可以直接当 socketcan 来使

#!/bin/bash
sudo modprobe can
sudo modprobe can_raw
sudo modprobe slcan

sudo slcand -c -s6 -o -f -S2000000 /dev/ttyACM1 can0
sudo ip link set up can0

下面是 slcand 命令的使用方法

$ slcand
slcand - userspace daemon for serial line CAN interface driver SLCAN.

Usage: slcand [options] <tty> [canif-name]

Options:
         -o          (send open command 'O\r')
         -c          (send close command 'C\r')
         -f          (read status flags with 'F\r' to reset error states)
         -l          (send listen only command 'L\r', overrides -o)
         -s <speed>  (set CAN speed 0..8)
         -S <speed>  (set UART speed in baud)
         -t <type>   (set UART flow control type 'hw' or 'sw')
         -b <btr>    (set bit time register value)
         -F          (stay in foreground; no daemonize)
         -h          (show this help page)

Examples:
slcand -o -c -f -s6 ttyUSB0

slcand -o -c -f -s6 ttyUSB0 can0

slcand -o -c -f -s6 /dev/ttyUSB0

接下来解释下 sudo slcand -c -s6 -o -f -S2000000 /dev/ttyACM1 can0:

  • -c, close, 首先关闭can通道
  • -s6, 设置 can 位速率 500 kbit/s, 注: 0~8, 对应 10,20,50,100,125,250,500,800,1000Kbit/s
  • -o, open, 打开can通道
  • -f, 读取状态
  • -S2000000, 串口波特率2Mbps, 因为是通过串口通信, 所以需要知道底层的串口波特率, 一般为 115200bps, 961200bps或2Mbps, slcand的最新源码里支持到 4Mbps
  • /dev/ttyACM1, 串口和虚拟串口设备
  • can0, 在 ip linkifconfig 中对应的名字
  • 事实上这条命令会让串口发出 C\rS6\rF\rO\r

运行完上面的脚本后, 就可以进行 candump cansend 收发了, 把 slcan 设备 接上 can 分析仪测试, 注意挂上至少 120Ω 终端电阻.

在这里插入图片描述

slcand 也可以用 socat 生成虚拟串口对来测试通信协议 sudo socat -d -d pty,link=/dev/ttyS10,raw,echo=0 pty,link=/dev/ttyS11,raw,echo=0

can-utils slcan_attach

slcan_attach 起到和 slcand 类似的效果, 只是不能指示波特率, 是不是弃用了?

sudo slcan_attach -s6 -o /dev/ttyACM13 -n can0
# 实际发出 `C\rS6\rO\r`, 为 9600bps
sudo ip link set up can0

slcan_attach 帮助文档为

$ slcan_attach
slcan_attach - userspace tool for serial line CAN interface driver SLCAN.

Usage: slcan_attach [options] tty

Options:
         -o          (send open command 'O\r')
         -l          (send listen only command 'L\r', overrides -o)
         -c          (send close command 'C\r')
         -f          (read status flags with 'F\r' to reset error states)
         -s <speed>  (set CAN speed 0..8)
         -b <btr>    (set bit time register value)
         -d          (only detach line discipline)
         -w          (attach - wait for keypress - detach)
         -n <name>   (assign created netdevice name)

    <speed>          Bitrate
          0            10 Kbit/s
          1            20 Kbit/s
          2            50 Kbit/s
          3           100 Kbit/s
          4           125 Kbit/s
          5           250 Kbit/s
          6           500 Kbit/s
          7           800 Kbit/s
          8          1000 Kbit/s


Examples:
slcan_attach -w -o -f -s6 -c /dev/ttyS1

slcan_attach /dev/ttyS1

slcan_attach -d /dev/ttyS1

slcan_attach -w -n can15 /dev/ttyS1

python slcan

linux 中可以直接使用 soketcan 来操作 slcan, 但是 windows 中没有 socketcan, 怎么操作 slcan 设备? 因为协议并不复杂, 完全可以手搓 串口通信 来收发 can 报文, 也有很多现成的封装好的, 如 CAN over Serial / SLCAN — python-can, 安装 python3 -m pip install python-can

windows 上 python 使用 slcan 发送 can 报文的示例代码

import can

# slcan
bus = can.interface.Bus(bustype='slcan', channel='COM3', ttyBaudrate=2000000, bitrate=500000)

# send msg
msg = can.Message(arbitration_id=0xc0ffee, data=[0, 25, 0, 1, 3, 1, 4, 1], is_extended_id=True)
bus.send(msg)
msg = can.Message(arbitration_id=0x123, data=[0, 25, 0, 1, 3, 1, 4, 1], is_extended_id=False)
bus.send(msg)

# receive msg
while True:
    msg = bus.recv()
    print(msg)
    if(msg.arbitration_id == 0x0120ffee):
        print("This is a message with id 0x0120ffee")
    elif(msg.arbitration_id == 0x456):
        print("This is a message with id 0x456")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

slcan 协议 脚本 测试 的相关文章

  • 机器学习算法知识点整理

    1生成模型generative model和判别模型 discriminative model 已知输入变量x xff0c 生成模型通过对观测值和标注数据计算联合概率分布P x y 来达到判定估算y的目的 判别模型通过求解条件概率分布P y
  • 我的2014年总结——奔波的一年

    2014年 xff0c 发生了一些人生的大事 xff0c 这些事既有忧 xff0c 又有喜 这因为有这些事情的发生 xff0c 所以我们才越发成熟 xff0c 越发稳重 2014年技术的提升没有前2年那么突飞猛进了 xff0c 生活的事情也
  • 谈谈你对Spring Bean生命周期的理解【面试】

    前言 面试中经常会被问到Spring Bean的生命周期 xff0c 有些人说记不住 xff0c 看了一遍源码也是云里雾里的 xff0c 那是因为只看理论 xff0c 没有自己实践 xff0c 如果自己亲自写代码验证一下 xff0c 不管是
  • FreeRTOS初级篇----名称规范

    数据类型 TickType t xff1a FreeRTOS中断计数值类型 xff0c 可以是16位也可以是32位 xff0c 对于32位CPU来说TickType t最好为32位 BaseType t xff1a 是能够让CPU运行效率最
  • FreeRTOS初级篇----创建任务--动态创建、静态创建

    任务创建函数 xff1a xTaskCreate BaseType t span class token function xTaskCreate span span class token punctuation span TaskFun
  • Linux 性能测试与分析

    源自 http blog sina com cn s blog 71ad0d3f01019uzl html Linux 性能测试与分析 Revision History Version Date Author Description 1 0
  • HashMap底层原理

    文章目录 1 HashMap的概念2 底层数据结构2 JDK1 8之前存在的问题 xff1f 3 问题 xff1a 加载因子为什么默认值为0 75f xff1f 4 问题 xff1a 如果得到key的hash值 xff08 哈希码 xff0
  • 解决虚拟机能够ping通本机,但是无法上网问题

    查看centos网关是否设置正确 root 64 localhost ethan grep GATEWAY etc sysconfig network scripts ifcfg etc sysconfig network scripts
  • c语言字符串分割函数

    C语言字符串分割 strsep函数用于分解字符串为一组字符串 定义语句为char strsep char stringp const char delim 使用实例 xff1a include lt stdio h gt include l
  • Android Socket学习(三)三方apk执行shell命令

    include lt stdio h gt include lt stdlib h gt include lt string h gt include lt fcntl h gt include lt sys types h gt incl
  • ADB命令用法大全

    一 ADB简介 Android Debug Bridge xff0c 安卓调试桥 xff0c 它借助adb exe xff08 Android SDK安装目录platform tools下 xff09 xff0c 用于电脑端与模拟器或者真实
  • SDN入门_基本概念掌握

    部署SDA的链接 xff1a https www cisco com c en us solutions enterprise networks software defined access compatibility matrix ht
  • docker-io, docker-ce, docker-ee 区别

    docker io docker engin 是以前早期的版本 xff0c 版本号是 1 xff0c 默认centos7 安装的是docker io xff0c 最新版是 1 13 docker ce 是社区版本 xff0c 适用于刚刚开始
  • Typora免费版下载【Mac、Windows】

    前言 Typora1 0版本之后是付费版本 xff0c 1 0之前的版本官方网站已移除 xff0c 在网上找了好久 xff0c 现在记录下来 下载 付费版 Typora支持macOS Window Linux系统 xff1a 官方下载地址
  • docker修改镜像名称以及tag版本

    docker tag 镜像ID 镜像名称 tag版本信息 docker tag 8ef375298394 mysql v5 7
  • npm安装报错解决合集(一)

    在新版nodejs已经集成了npm xff0c 所以npm也都安装好了 可以通过输入下面命令来测试是否成功安装 node v npm v 如果安装成功 xff0c 都会出现版本号 用npm v测试 xff0c 报错 xff1a node i
  • ES6系列——类数组转换为数组的几种方法以及for of、forin、for Each的区别

    以及目录 一 什么是类数组 xff1f 二 什么是类数组对象 xff1f 第一种方法 xff1a 使用for in 将类数组对象转换为数组 第二种方法 内置对象keys和valus 第三种方法 xff1a Array from for of
  • 对.net事件的看法

    一 事件的本质 事件是软件系统里的两个子系统之间 xff0c 或者两个模块之间 xff0c 或者两个对象之间发送消息 xff0c 并处理消息的过程 在面向对象的世界里 xff0c 就可以统一认为是两个对象之间的行为 两个对象之间发送的这种消
  • 深入理解module.exports、exports、require、export、export default、import

    前言 xff1a 说到module exports exports require export export default import这些 xff0c 有一点我们是必须要提一下的 xff0c 就是模块化编程方式 以上这些都是模块之间的

随机推荐

  • 服务器安全设置Centos7 防火墙firewall与iptables

    一 gt gt gt gt gt gt 启用centos7 iptables防火墙Centos7 防火墙firewall设置方法 我们Sinesafe在处理客户服务器Linux Centos7 64位系统里配置防火墙安全设置需要选择2种方案
  • VTK基本概念之坐标系统

    坐标系统 在实际开发中 xff0c 必须理解不同坐标系统之间的关系 计算机图形学里常用的四种坐标系 xff1a Model坐标系 Word坐标系 View坐标系和Display坐标系统 xff0c 转换关系如下图所示 VTK支持多种不同类型
  • STM32学习(蜂鸣器实验)

    蜂鸣器硬件电路连接 蜂鸣器软件设计 库函数 使能输入输出口时钟 调用函数RCC AHB1PeriphClockCmd 初始化输入输出口模式 调用函数GPIO Init 操作输入输出口 xff0c 输出高低电平 beep h ifdef BE
  • Esxi\CentOS7.6虚机\2080ti驱动 Unable to determine the device handle for GPU 0000:0B:00:00: Unknown ERROR

    整体背景 服务器使用Esxi虚拟出CentOS7 6的虚机 xff0c 然后在虚机中给2080ti显卡安装驱动 安装过程 1 配置显卡直通 此部分由运维完成 xff0c 未参与其中 xff0c 可参考攻略 xff1a https blog
  • 从断舍离中整理生活

    前言 公众号有一个多月未更文 xff0c 主要思考了后续更文的方向 xff0c 最终确定了以读书笔记分享为主题 xff0c 和大家一起学习 一起成长 今天开始 xff0c 每周至少更新一篇文章 xff0c 大家有想看的书可以在后台留言 xf
  • Android Studio升级到 3.2.0,部分依赖库报错 android.arch.lifecycle:runtime:1.0.3,解决办法

    Android Studio升级到 3 2 0 xff0c 部分依赖库报错 问题描述 xff1a Cannot find a version of android arch lifecycle runtime that satisfies
  • OpenCV4.7.0、FFmpeg5.1 Nvidia GPU视频硬解码

    1 环境 操作系统 xff1a Ubuntu18 04 GPU xff1a Nvidia GeForce RTX 2080TI 2 安装2080TI驱动 请参考文章 158条消息 NVIDIA GPU 驱动程序安装 洪流之源的博客 CSDN
  • MQ-2烟雾传感器的使用

    一 MQ 2烟雾传感器简介 MQ 2 烟雾传感器采用在清洁空气中电导率较低的二氧化锡 SnO2 xff0c 属于表面离子式N型半导体 当MQ 2烟雾传感器在200到300摄氏度环境时 xff0c 二氧化锡吸附空气中的氧 xff0c 形成氧的
  • HC-SR04超声波测距模块介绍

    超声波简介 超声波是由机械振动产生的 可在不同介质中以不同的速度传播 具有定向性好 能量集中 传输过程中衰减较小 反射能力较强等优点 超声波传感器可广泛应用于非接触式检测方法 它不受光线 被测物颜色等影响 对恶劣的工作环境具有一定的适应能力
  • 液晶12864显示图片

    液晶12864简介 12864是128 64点阵液晶模块的点阵数简称 基本参数 1 低电源电压 xff08 VDD 43 3 0 xff5e 43 5 5V xff09 2 显示分辨率 128 64 点 3 内置汉字字库 xff0c 提供8
  • 液晶12864显示字符

    液晶12864简介 12864是128 64点阵液晶模块的点阵数简称 基本参数 1 低电源电压 xff08 VDD 43 3 0 xff5e 43 5 5V xff09 2 显示分辨率 128 64点 3 内置汉字字库 xff0c 提供81
  • Bash:command:未找到命令

    前言 在Linux系统中 xff0c 经常会遇到这样的问题 xff1a bash xff1a command xff1a 未找到命令 这个真的很烧脑 xff0c 遇到的次数多 xff0c 在网上也查了好多 xff0c 答案五花八门 xff0
  • S32K148----SDK笔记----CAN收发

    文章目录 前言建立工程ProcessorExpert配置发送CAN报文CAN接收中断工程代码微信公众号 前言 S32K148自带3路CAN 官方的SDK给了can pal的例程 本文更基础一点 直接用flexcan组件相关的函数 CANFD
  • TC397开发板KIT_A2G_TC397_5V_TFT简介

    开发板简介 照片资料调试资源供电扩展CAN 用的开发板是KIT A2G TC397 5V TFT 其实更推荐KIT A2G TC397 3V3 TFT 售价 1 670 59 照片 正面 背面 5V的板子和3 3V的板子主要是下面几个器件不
  • AURIX TC397 Flash编程

    目录 Flash编程基础知识Flash Programming微信公众号 Flash编程基础知识 参考 Flash Programming 1 for KIT AURIX TC397 TFT 本例展示了如何烧写PFLASH Program
  • 周立功USBCAN-II的Python调用

    目录 USBCAN II环境配置CAN收发运行zcanpro微信公众号 USBCAN II USBCAN II 或者叫USBCAN2是周立功 致远电子 比较经典的USB接口的CAN卡 有两路标准CAN 最高支持到1M波特率 单用USB就可以
  • 拒绝丧偶式育儿,正确「养育男孩」

    前言 如何养育男孩 xff1f 当写下这几个字的时候 xff0c 我已在心里默念了好几遍 xff0c 不知道该如何回答 在2年前的某个凌晨2点18分 xff0c 第一声婴儿地啼哭 xff0c 护士告诉我 是个男孩 开始 xff0c 我就买了
  • Pandoc 多Markdown转单PDF

    文章目录 Pandoc 简介Pandoc 安装pandoc latex template字体安装Powershell 脚本Ubuntu PandocMarkdown 合并 Pandoc 简介 Pandoc 免费的文档转换器 支持常见的各种文
  • SocketCAN 命名空间 VCAN VXCAN CANGW 举例

    文章目录 NAMESPACESocketCAN最新 can utils 安装VCAN 举例VXCAN 举例CANGW 举例参考 NAMESPACE namespaces 命名空间 将全局系统资源包装在抽象中 使命名空间中的进程看起来拥有自己
  • slcan 协议 脚本 测试

    文章目录 slcan 协议kernel slcancan utils slcanptycan utils slcandcan utils slcan attachpython slcan slcan 协议 slcan 基于文本 ASCII