SocketCAN 命名空间 VCAN VXCAN CANGW 举例

2023-05-16

文章目录

    • NAMESPACE
    • SocketCAN
    • 最新 can-utils 安装
    • VCAN 举例
    • VXCAN 举例
    • CANGW 举例
    • 参考

NAMESPACE

namespaces, 命名空间, 将全局系统资源包装在抽象中, 使命名空间中的进程看起来拥有自己全局资源的独立实例. 命名空间的一个用途是实现容器.

Linux 命名空间类型及隔离物(Isolates):

  • Cgroup, Cgroup根目录
  • IPC, System V IPC, POSIX消息队列
  • Network, 网络设备, 堆叠, 端口等
  • Mount, 挂载点
  • PID, 进程ID
  • Time, 启动和单调时钟
  • User, 用户和组ID
  • UTS, 主机名和NIS域名

随着不断发展, 命名空间的类型也可能继续增删. SocketCAN 属于网络, 所以本篇主要是用到 Network 网络命名空间.

SocketCAN

SocketCAN, 是Linux的CAN协议实现, 使用 Berkeley socket API, Linux网络堆栈, 把 CAN 设备驱动实现为网络接口. CAN 的 socket API 设计与 TCP/IP 协议尽可能相似, 熟悉网络编程就能轻松的使用 SocketCAN.

SocketCAN 网络层协议和帧处理 的参考示意图:

在这里插入图片描述

其中:

  • CAN_RAW, 读取和写入 CAN 帧, 经过了接收过滤器(receive filters), Linux ns时间戳, 单个CAN口允许多个应用独立运行, 本地回显可实现网络透传, CAN_RAW 经常配合 bind 使用
  • CAN_BCW, Broadcast Manager, 循环消息的计时器和过滤器支持, 收发路径功能, 逐位过滤 CAN 帧 payload, 检测超时, 多路 CAN 消息的即时数据更新, CAN_BCW 需要配合 connect 使用, 当使用 recvfrom() 而不是 read() 检索BCM套接字消息时, can_ifindex 提供了原始 CAN 接口. 通过 CAN_BCM 可以方便的把 CAN 对接到其它接口如 ETH, UART 等
  • ISO-TP, ISO 15765-2 定义的 CAN 传输协议, 已经合并进 Linux 主线内核 5.10 及以后的版本. ISO-TP 将较长消息分割成多帧, 添加元数据(metadata), 允许接收方解释各个帧并重新组合成完整消息包. 先前版本 payload 限制最大4095字节, ISO 15765-2:2016 之后的版本扩大为 2^32-1 = 4294967295 字节(4GB -1)
  • CAN_GW, 基于Linux内核的 CAN 帧路由, 可使用 PF_CAN 接收滤波器, NET_RX 软中断, 基于 PF_NETLINK 的类似 iptables 的配置接口, 可动态修改CAN帧, 用 AND/OR/XOR/SET 操作改变 CAN 标识符, DLC, payload 数据等, 修改后可计算 XOR 和 CRC8, 支持不同的 CRC8 配置(1U8, 16U8, SFFID_XOR)

这里顺便列下 ISO 15765 (headlined Road vehicles — Diagnostic communication over Controller Area Network (DoCAN)):

  • ISO 15765-1, 通用信息和用例定义
  • ISO 15765-2, 传输协议和网络层服务 (ISO-TP)
  • ISO 15765-3, 实现统一诊断服务 (UDS on CAN), 已过时, 替换为 ISO14229-3 (CAN, ETH, UART => DoCAN, DoIP等)
  • ISO 15765-4, emissions 等相关系统的需求

以 Orin 为例, 一个典型的2路 SocketCAN 的启动脚本:

#!/bin/sh

# 寄存器配置
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458

# Module 加载
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan

# TDC 配置, 以支持 2M 以上 CANFD
sudo sh -c 'echo 0x600 > /sys/devices/platform/c310000.mttcan/net/can0/tdc_offset'
sudo sh -c 'echo 0x600 > /sys/devices/platform/c320000.mttcan/net/can1/tdc_offset'

# CAN0 配置
sudo ip link set down can0
sudo ip link set can0 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 dsample-point 0.8 berr-reporting on fd on restart-ms 100
sudo ip link set up can0 mtu 72
sudo ifconfig can0 txqueuelen 1000
# ip -s -d link show can0

# CAN1 配置
sudo ip link set down can1
sudo ip link set can1 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 dsample-point 0.8 berr-reporting on fd on restart-ms 100
sudo ip link set up can1 mtu 72
sudo ifconfig can1 txqueuelen 1000
# ip -s -d link show can1

一个典型的 SocketCAN 的应用初始化例子如下:

{
	int s;
    struct sockaddr_can addr;
    struct ifreq ifr;

    if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
        perror("Error while opening socket");
        return -1;
    }

    strcpy(ifr.ifr_name, "can0" );
    ioctl(s, SIOCGIFINDEX, &ifr);

    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    
    // CANFD 支持
    int enable_canfd = 1;
    if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES,
		&enable_canfd, sizeof(enable_canfd))) {
		printf("error when enabling CAN FD support\n");
		return 1;
	}
	
	// 滤波器, 略

    if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("Error in socket bind");
        return -2;
    }
}

初始化后可以使用正常的 read 和 write, 多个 socketcan 接口可以类似网络那样使用 epoll 等进行管理. c++ 的 asio 同样支持.

最新 can-utils 安装

can-utils 是 Linux CAN/SocketCAN 的用户空间应用程序. 如常见的 cansend, candump 等

之前的 cangw 对 canfd 的支持并不好, 在新版 can-utils 提供了支持, 可直接从源码编译安装:

git clone https://github.com/linux-can/can-utils.git
cd can-utils
mkdir build && cd build && make -j12 && sudo make install

VCAN 举例

Linux 虚拟网络 的功能异常丰富, 为容器等打下了坚实的技术基础.

VCAN, Virtual CAN, 类似于虚拟的网络 loopback 设备, 在本机测试CAN协议实现时, 可以使用 VCAN.

在这里插入图片描述

实现上图的一个 vcan0 的脚本

#!/bin/bash
# if -c parameter is given, then clean up
if [ "$1" = "-c" ]; then
    sudo ip link set down vcan0
    sudo ip link delete vcan0
    exit 0
fi
sudo modprobe can
sudo modprobe can-raw
sudo modprobe vcan
# if vcan0 is already created, delete it
if [ -e /sys/class/net/vcan0 ]; then
    sudo ip link set down vcan0
    sudo ip link delete vcan0
fi
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

是的, vcan 无需设置通信速率等, 内核跑多快, 速率就有多快, 自带 loopback, 多个 app 可以通过单个 vcan 通信. can 和 canfd 也都支持的不错, 命名也不必 vcanx, 取名 dog, vcanpig 也可以

# 可以多个窗口开多个candump
$ candump -td -x vcan0
 (000.000000)  vcan0  TX - -  123   [2]  11 22
 (025.888347)  vcan0  TX B E  12345678  [12]  11 22 33 44 55 66 77 88 99 00 00 00
 
$ cansend vcan0 123#11.22
$ cansend vcan0 12345678##3.11.22.33.44.55.66.77.88.99

VXCAN 举例

VXCAN, Virtual CAN Tunnel, 与 veth 类似, 实现了 CAN 流量隧道, 创建 VXCAN 时, 两个 VXCAN 设备会成对创建, 可用于跨命名空间通信, 不提供本地回显 loopback. 见于 Linux 4.12 内核以后

在这里插入图片描述

实现上图的一个 vxcan 的脚本

#!/bin/bash

# if -c parameter is given, then clean up
if [ "$1" = "-c" ]; then
    sudo ip link set down vxcan0
    sudo ip link delete vxcan0
    exit 0
fi

sudo modprobe can
sudo modprobe can_raw
sudo modprobe vxcan

sudo ip link add vxcan0 type vxcan peer name vxcan1
sudo ip link set vxcan0 up
sudo ip link set vxcan1 up

说明:

  • 删除一对中的任意一个, 另一个也会消失
  • 默认支持 can 和 canfd

运行后, 可以看到多出一对 vxcan 设备

$ ip link
22: vxcan1@vxcan0: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can 
23: vxcan0@vxcan1: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can 
    
$ candump -td -x any
 (000.000000)  vxcan1  TX B E  123  [12]  11 22 33 44 55 66 77 88 99 00 00 00
 (000.000020)  vxcan0  TX B E  123  [12]  11 22 33 44 55 66 77 88 99 00 00 00
 (008.254112)  vxcan0  TX B E  12345678  [12]  11 22 33 44 55 66 77 88 99 00 00 00
 (000.000021)  vxcan1  TX B E  12345678  [12]  11 22 33 44 55 66 77 88 99 00 00 00
 
$ cansend vxcan0 123##3.11.22.33.44.55.66.77.88.99
$ cansend vxcan1 12345678##3.11.22.33.44.55.66.77.88.99

下面是一个跨命名空间通信的例子

  • 除了 host, 还有 netns1, netns2 两个网络命名空间
  • vxcan0-vxcan1 连接了 netns1, netns2 两个网络命名空间
  • vxcan2-vxcan3 连接了 netns1 和 host
  • app1 既能和 app2/app3 通信, 也能和 app4 通信

在这里插入图片描述

实现上图的脚本

#!/bin/bash

# if -c parameter is given, then clean up
if [ "$1" = "-c" ]; then
    sudo ip netns del ns1
    sudo ip netns del ns2
    # sudo ip link set down vxcan2
    # sudo ip link delete vxcan2
    exit 0
fi

sudo modprobe can
sudo modprobe can_raw
sudo modprobe vxcan

# ns1 - ns2
sudo ip netns add ns1
sudo ip netns add ns2
sudo ip link add vxcan0 netns ns1 type vxcan peer name vxcan1 netns ns2
sudo ip netns exec ns1 ip link set vxcan0 up
sudo ip netns exec ns2 ip link set vxcan1 up

# ns1 - host
sudo ip link add vxcan2 netns ns1 type vxcan peer name vxcan3
sudo ip netns exec ns1 ip link set vxcan2 up
sudo ip link set vxcan3 up

运行后, 可以在各自的命名空间查看

$ ip link
24: vxcan3@if5: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can  link-netns ns1
    
    
$ sudo ip netns exec ns1 ip link
4: vxcan0@if4: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can  link-netns ns2
5: vxcan2@if24: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can  link-netnsid 1
    
$ sudo ip netns exec ns2 ip link
4: vxcan1@if4: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/can  link-netns ns1

收发测试

# ns1,vxcan0 - ns2,vxcan1
$ sudo ip netns exec ns1 candump -td -x any
$ sudo ip netns exec ns2 candump -td -x any
$ sudo ip netns exec ns1 cansend vxcan0 123##3.11.22
$ sudo ip netns exec ns2 cansend vxcan1 123##3.11.23

# ns1,vxcan2 - host,vxccan3
$ sudo ip netns exec ns1 candump -td -x any
$ candump -td -x any
$ sudo ip netns exec ns1 cansend vxcan2 123##3.11.22
$ cansend vxcan3 123##3.11.23

如果嫌前缀 sudo ip netns exec ns1 过长的话, 可以先进入ns1: sudo ip netns exec ns1 bash. 其它命令举例

$ ip netns list
ns2
ns1 (id: 0)

$ sudo ip netns exec ns2 lsns
        NS TYPE   NPROCS    PID USER            COMMAND
4026533123 mnt        10  85584 root            /init
$ sudo nsenter -t 85584 -n bash
# exit 或 Ctrl+D 退出这个bash

CANGW 举例

安装 can-utils 后就可以使用 cangw 命令了

先来查看下 help, 可以看出, 新的 can-utils 中的 cangw 已经支持了 canfd

$ cangw help
cangw - manage PF_CAN netlink gateway.

Usage: cangw [options]

Commands:
          -A  (add a new rule)
          -D  (delete a rule)
          -F  (flush / delete all rules)
          -L  (list all rules)
Mandatory:
          -s <src_dev>  (source netdevice)
          -d <dst_dev>  (destination netdevice)
Options:
          -X  (this is a CAN FD rule)
          -t  (preserve src_dev rx timestamp)
          -e  (echo sent frames - recommended on vcanx)
          -i  (allow to route to incoming interface)
          -u <uid>  (user defined modification identifier)
          -l <hops>  (limit the number of frame hops / routings)
          -f <filter>  (set CAN filter)
          -m <mod>  (set Classical CAN frame modifications)
          -M <MOD>  (set CAN FD frame modifications)
          -x <from_idx>:<to_idx>:<result_idx>:<init_xor_val>  (XOR checksum)
          -c <from>:<to>:<result>:<init_val>:<xor_val>:<crctab[256]>  (CRC8 cs)
          -p <profile>:[<profile_data>]  (CRC8 checksum profile & parameters)

Values are given and expected in hexadecimal values. Leading 0s can be omitted.
...

cangw 可以把 真实的can, vcan, vxcan 连起来, 如

在这里插入图片描述

或者

在这里插入图片描述

此图中 app0 可以和 app2, app3, app4, app5 进行通信, 脚本如下

#!/bin/bash

# if -c parameter is given, then clean up
if [ "$1" = "-c" ]; then
    sudo cangw -F -s vcan0 -d vxcan0
    sudo cangw -F -s vxcan0 -d vcan0
    cangw -L
    sudo ip link set down vxcan0
    sudo ip link delete vxcan0
    sudo ip link set down vcan0
    sudo ip link delete vcan0
    exit 0
fi

sudo modprobe can
sudo modprobe can_raw
sudo modprobe can-gw
sudo modprobe vcan
sudo modprobe vxcan

# vxcan
sudo ip link add vxcan0 type vxcan peer name vxcan1
sudo ip link set vxcan0 up
sudo ip link set vxcan1 up

# vcan
sudo ip link add vcan0 type vcan
sudo ip link set vcan0 up

# cangw
sudo cangw -A -s vcan0 -d vxcan1 -e
sudo cangw -A -s vxcan0 -d vcan0 -e
sudo cangw -A -X -s vcan0 -d vxcan0 -e
sudo cangw -A -X -s vxcan0 -d vcan0 -e

说明:

  • -A, add, 添加规则
  • -s, source, 源
  • -d, destination
  • -e, echo sent frames - recommended on vcanx, 回显
  • -X, CAN FD支持, 这里标准 CAN 和 CAN FD 分开写了, 不知道未来会不会合并

查看 cangw 规则列表

$ cangw -L
cangw -A -s vxcan0 -d vcan0 -e # 0 handled 0 dropped 0 deleted
cangw -A -s vcan0 -d vxcan0 -e # 0 handled 0 dropped 0 deleted
cangw -A -s vxcan0 -d vcan0 -e # 0 handled 0 dropped 0 deleted
cangw -A -s vcan0 -d vxcan1 -e # 0 handled 0 dropped 0 deleted

测试

$ candump -td -x any
 (000.000000)  vxcan1  TX - -  123   [1]  11
 (000.000036)  vxcan0  TX - -  123   [1]  11
 (000.000003)   vcan0  RX - -  123   [1]  11
 (005.983670)  vxcan1  TX B E  123  [02]  11 22
 (000.000039)  vxcan0  TX B E  123  [02]  11 22
 (000.000003)   vcan0  RX B E  123  [02]  11 22
 (011.298185)   vcan0  TX B E  123  [03]  11 22 33
 (000.000041)  vxcan1  RX B E  123  [03]  11 22 33
 (000.000000)  vxcan0  RX B E  123  [03]  11 22 33
 (013.869664)   vcan0  TX - -  123   [4]  11 22 33 44
 (000.000041)  vxcan0  RX - -  123   [4]  11 22 33 44
 (000.000001)  vxcan1  RX - -  123   [4]  11 22 33 44
 
$ cansend vxcan0 123#11
$ cansend vxcan0 123##3.11.22
$ cansend vcan0 123##3.11.22.33
$ cansend vcan0 123#11.22.33.44

参考

  • linux-can/can-utils: Linux-CAN / SocketCAN user space applications (github.com)
  • SocketCAN mit Docker unter Linux, PPT
  • SocketCAN mit Docker unter Linux, Video
  • SocketCAN + Docker = The solution
  • Design & separation of CAN applications
  • SocketCAN - Controller Area Network
  • Introduction to Linux interfaces for virtual networking
  • WSL 和 Jetson 的内核 vxcan 支持
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SocketCAN 命名空间 VCAN VXCAN CANGW 举例 的相关文章

  • OpenCV/caffe安装流程

    公司正在做人脸识别系统 xff0c 用到了OpenCV库 xff0c 下面就是根据网上资料以及自己多次部署安装的经验整理的安装流程 xff0c 希望能给一些人一点参考 系统 xff1a Ubuntu1604 CPU架构 xff1a 一般是x
  • win10远程桌面连接ubuntu18.04

    一开始 xff0c 我是根据这个教程进行操作的 xff0c 改了设置为共享 xff0c 安装xrdp等 xff0c 一切都完成后 xff0c 当进行连接时 xff0c 也会出现那个xrdp连接界面 xff0c 但只要一登陆 xff0c 界面
  • 机器学习算法知识点整理

    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 命名空间 将全局系统资源包装在抽象中 使命名空间中的进程看起来拥有自己