Python(C_Cpp)分析模拟Arduino和Raspberry Pi(单板机)CAN总线和车载单元测试

要点

  1. CAN总线释义:物理层结构,数据帧,数据交换,总线接口物理模块。
  2. 一对Arduino CAN (Arduino C 处理)总线项目:
    1. 发送端发送随机数据,接收端接收并计算。
    2. 发送端点动信号,接收端触发LED亮灯。
    3. 发送端温度传感器检测计算,接收端蜂鸣器报警。
    4. 接收端发送请求指令,发送端接收到指令后,发送温度数据。
    5. 外部点动信号触发接收端,接收端发送请求指令,发送端接收到指令后,发送温度数据。
    6. 三种外部点动信号触发发送端,发送端发送对应指令,接收端接收后,显示对应颜色的LED。
    7. 发送端温湿度传感器检测计算,接收端接收温湿度数据并LCD显示。
    8. 两个发送端两个温度传感器检测计算,一个接收端接收两个温度数据并LCD显示。
    9. 两个发送端两个温度传感器检测计算,一个接收端根据两个外部点动信号触发,分别显示两个发送端温度数据并LCD显示。
    10. 模拟逻辑分析器,接收端定时嗅探发送端数据
  3. Raspberry Pi和Arduino CAN总线(Arduino C 处理)项目:
    1. 发送端(Raspberry Pi)发送字符数据,接收端(Arduino)接收并显示在串口监控
    2. 发送端(Arduino)发送数字,接收端(Raspberry Pi)接收并显示
    3. 发送端(Raspberry Pi)发送指令,接收端(Arduino)接收指令控制两个LED
    4. (Python 处理)两个外部信号分别触发发送端(Raspberry Pi),接收端(Arduino)分别控制两个LED
    5. (Python 和Arduino C 处理)两个外部点动信号触发一个发送端(Arduino),分别控制一个接收端(Raspberry Pi)和一个接收端(Arduino)
  4. Qt C++ CAN总线数据捕捉器模拟操控车载总线
  5. Python单板机从车载诊断 II 端口提取 CAN总线数据并云端监控
  6. Arduino 和STM32 发动机控制单元渗透测试

CAN总线

控制区域网络 (CAN) 总线是一种串行通信协议,允许设备以可靠且高效的方式交换数据。它广泛应用于车辆中,像神经系统一样连接车辆中的ECU。CAN 总线数据可以提供有关所连接设备的性能和状态的宝贵见解。然而,由于高数据速率、低带宽和可变的网络条件,收集和处理 CAN 总线数据可能具有挑战性。

工作原理

CAN总线是一种分散式通信协议。其分散式方法使其成为可靠性和实时性能至关重要的汽车和工业系统应用的理想选择。在 CAN 网络中,所有节点都通过双绞线或光纤电缆连接。 每个节点都有自己的微控制器,负责处理传入消息和发送传出消息。 数据由共享总线上的节点广播,允许所有其他节点接收它。 通讯过程的主要阶段是:

  1. 仲裁:为了防止多个节点同时尝试传输时发生冲突,CAN 使用基于消息优先级的仲裁过程。消息的标识符值越低,其优先级越高。
  2. 错误检测:内置错误检测机制可确保 CAN 网络内的数据完整性。其中包括循环冗余校验 (CRC)、帧校验序列 (FCS) 和来自接收节点的确认位。
  3. 故障限制:如果任何节点在传输过程中检测到错误或故障,它将进入“错误被动”状态,直到恢复正常运行。这可以防止错误传输影响整个系统功能。

报文结构

CAN 总线系统中的消息结构对于设备之间的高效通信至关重要。 该协议使用由多个字段组成的数据帧格式,包括标识符、控制字段、数据字段和错误检测机制。

  • 标识符:这个唯一值决定网络上每条消息的优先级。 在标准 11 位标识符 (CAN 2.0A) 中,最多有 2048 个不同的优先级可用。 扩展 29 位标识符 (CAN 2.0B) 提供了更多选项,具有超过 5 亿个不同值。
  • 数据长度代码 (DLC):位于控制字段内,该代码指定数据字段中存在多少字节 - 范围从 0 到 8 个字节。
  • 数据字段:包含以字节大小的段在节点之间传输的实际信息。
  • 循环冗余校验 (CRC):一种内置错误检测机制,通过检测传输错误并在必要时请求重传来确保可靠的通信。
  • 确认时隙:接收节点使用的单个位来确认消息的成功接收或指示需要重传的错误。
  • 错误帧:CAN 消息传递的可选部分,允许节点在检测到自身传输问题或从网络上其他设备接收到的消息时发出信号。

CAN总线模拟

创建 Linux虚拟CAN接口

虚拟 CAN 接口是开发 CAN 节点时的完美解决方案,无需实际的物理 CAN 总线。 将虚拟 CAN 接口视为软件 CAN 适配器,通过它您可以访问模拟 CAN 总线。 Linux 内核的 SocketCAN 子系统内置了对虚拟 CAN 接口的支持。

在 Linux 上,内核直接提供 CAN 功能。 它被称为 SocketCAN。 SocketCAN 不仅包含硬件驱动程序和控制器局域网的网络协议栈。 它还支持虚拟 CAN 设备。

虚拟 CAN 接口的唯一限制是您无法直接访问硬件 CAN 节点。 但是,您可以使用 CAN 网关内核模块 can-gw 并在物理和虚拟 CAN 总线之间路由消息,以绕过此限制。

在 Linux 上使用虚拟 CAN 接口之前,您需要在终端中执行以下三个步骤:

  • 加载 vcan 内核模块: sudo modprobe vcan

  • 创建虚拟 CAN 接口: sudo ip link add dev vcan0 type vcan

  • 使虚拟 CAN 接口联机: sudo ip link set up vcan0

之后,您可以运行 ip addr | grep "can" 命令来验证虚拟 CAN 接口在 Linux 系统上是否可用且在线:

pragmalin@ubuntuvm: \$|sudo modprobe vcan
pragmalin@ubuntuvm: \$ sudo ip link add dev vcano type vcan
pragmalin@ubuntuvm: \$ sudo ip link set up vcan0
pragmalin@ubuntuvm: \$ ip addr | grep "can"
3:vcan0: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UNKNOWN group default qlen 1000

如果您之前在 Linux 下使用过真正的 CAN 硬件,您会注意到一个区别:ip addr 命令的输出显示状态为 UNKNOWN,而不是 UP。这对于 Linux 上的虚拟 CAN 接口来说是正常的。

请注意,您不必在 Linux 上为虚拟 CAN 接口配置 CAN 比特率。 SocketCAN子系统模拟CAN总线,不需要做任何通信同步。

您可以使用基本的 bash 脚本自动执行这些步骤:

#!/bin/bash
# Make sure the script runs with super user privileges.
[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"
# Load the kernel module.
modprobe vcan
# Create the virtual CAN interface.
ip link add dev vcan0 type vcan
# Bring the virtual CAN interface online.
ip link set up vcan0

将这些内容保存到您的主目录中的文件中。例如:~/vcan.sh。然后将其标记为可执行文件:chmod +x ~/vcan.sh。从现在开始,您只需运行此脚本即可在 Linux 系统上获取 vcan0 虚拟 CAN 接口:

  • cd ~
  • ./vcan.sh

请注意,该脚本会自动提示您输入 sudo 密码。

C++ CAN简易测试

利用上述虚拟CAN接口

#include <QCanBus>
#include <QCanBusDevice>
#include <QCanBusFrame>
#include <QDebug>int main()
{// Show enumerating the available plugins.qDebug() << "Available plugins:";for (auto plugin : QCanBus::instance()->plugins()) {qDebug() << "  " << plugin;}// Create device.QCanBusDevice *device = QCanBus::instance()->createDevice("socketcan", "vcan0");if (device != nullptr) {qDebug() << "Created device, state is:" << device->state();} else {qFatal("Unable to create CAN device.");}// Connect.if (device->connectDevice()) {qDebug() << "Connected, state is:" << device->state();} else {qDebug() << "Connect failed, error is:" << device->errorString();}// Create a data frame.QCanBusFrame frame(QCanBusFrame::DataFrame, "12345");// Send it.if (device->writeFrame(frame)) {qDebug() << "Wrote frame, state is:" << device->state();} else {qDebug() << "Write failed, error is:" << device->errorString();}// Disconnect.device->disconnectDevice();qDebug() << "Disconnected, state is:" << device->state();return 0;
}
参阅一:计算思维
参阅二:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

certificate has expired or is not yet valid:npm和node证书过期问题

在 1 月 22 日&#xff0c;淘宝原镜像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 证书正式到期。如果想要继续使用&#xff0c;需要将 npm 源切换到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否则会报错。 解决方案切换到新的源&a…

HTML表单

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 四、HTML表单 CSS 1、vh单位表示视口高度&#xff0c;等于视口高度的1%。这使得它相对于视口高度。height:100vh; 2、设置 body 的默认 margin 为 0 来重置…

【掌握版本控制:Git 入门与实践指南】远程操作|标签管理

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

汽车IVI中控开发入门及进阶(十三):语音识别

前言: IVI中控上的语音识别,在目前市场上也是非常显眼的一个创新,大幅改变了传统IVI的操作习惯。 语音识别Speech recognition,也称为自动语音识别(ASR)、计算机语音识别或语音到文本,是一种使程序能够将人类语音处理成书面格式的能力。 语音识别Speech recognition是计…

数码管的静态显示(二)

1.原理 要按照上图的顺序传递位选和段选的数据。 因为q0是最高位&#xff0c;共阳极数码管结构是dp....a&#xff0c;所以应该先传入低位a&#xff0c;而a在上图中的8段2进制编码中是seg[7]&#xff0c;所以段选信号的顺序是seg[0],...seg[7]。 因为输出信号是两个时钟&#x…

Docker入门笔记(1)

Docker入门笔记&#xff08;1&#xff09; 容器技术入门 之前我的WIT问卷管理系统在阿里云上部署需要好多配置&#xff0c;各个环境耦合的比较紧密&#xff0c;花了不少时间去做部署和调配。 现在有了Docker以后&#xff0c;我们可以把各种组件配置好&#xff0c;然后打包成…

使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示

前言 在.NET应用开发中数据集的交互式显示是一个非常常见的功能&#xff0c;如需要创建折线图、柱状图、饼图、散点图等不同类型的图表将数据呈现出来&#xff0c;帮助人们更好地理解数据、发现规律&#xff0c;并支持决策和沟通。本文我们将一起来学习一下如何使用ScottPlot库…

C语言snprintf():将格式化字符串输出到数组中

snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, const char *format[,argument...…

websocket逆向案例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、案例地址二、分析流程三、逆向参数四、webSocket 交互位置总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经&#xff0c;我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助&#xff01; Java String 为什么是不可变的? public final class String implements java.io.Seri…

Python: for,while循环语句

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; While循环 while循环用于在给定条件为真时重复执行一段代码。它会一直执行循环体内的代码&#xff0c;直到条件不再为真。这种循环特别适合于你…

‘UnityEngine.Application‘ does not contain a definition for isBatchMode

unity 2017.4.37f1. 解决办法: Try to replace Application.isBatchMode with UnityEditorInternal.InternalEditorUtility.inBatchMode

AUTOSAR汽车电子嵌入式编程精讲300篇-汽车CAN总线中的 信息安全与通信协议(续)

目录 4 基于AES算法的CAN总线加密通信 4.1 CAN总线加密通信流程设计 4.2 AES算法 4.2.1 算法实现

前端实现读取word文件,并将其进行原样式展示的几种方案

在前端直接读取并原样展示Word文档是一个相对复杂的任务&#xff0c;因为Word文档的格式&#xff08;如.doc或.docx&#xff09;与Web技术栈使用的格式&#xff08;HTML、CSS&#xff09;不兼容。要实现这一功能&#xff0c;通常需要将Word文档转换为Web友好的格式。以下是实现…

Ps:拾色器

在 Adobe 拾色器中&#xff0c;可以使用四种颜色模型来设置颜色&#xff1a;HSB、RGB、Lab 和 CMYK。 使用“拾色器”对话框可以设置前景色、背景色、填充颜色、文本颜色及专色等的颜色值。 ◆ ◆ ◆ 常用操作方法与技巧 1、注意观察“拾色器”对话框标题栏中括号里的内容&am…

交换排序实现

文章目录 冒泡排序快速排序快排的优化单次快排的其他方案快排的非递归实现 冒泡排序 冒泡排序&#xff0c;Bubble sort,通过重复遍历要排序的数列&#xff0c;比较每一对相邻元素&#xff0c;并在顺序错误时交换它们。这个过程一直重复&#xff0c;直到没有需要交换的相邻元素为…

动态规划 Leetcode 1049 最后一块石头的重量

最后一块石头的重量 Leetcode 1049 学习记录自代码随想录 要点&#xff1a;1.想到求最后剩下石头的重量可以转化为求石头组合重量最接近石头重量总和的一半和此时剩下石头重量的差值&#xff0c;从而联想到Leetcode 416此题便可以相同套路求解 class Solution { public:int…

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单&#xff0c;但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始&#xff0c;ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…

windows ffmpeg 编译环境搭建

编译ffmpeg https://www.msys2.org/ https://www.ffmpeg.org/platform.html#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows 1.安装msys2 2.安装yasm或者nasm 打开VC 本地环境命令行 唤醒msys2界面 配置编译环境变量参数 export PATH"/d/vs…

Dynamo处理Excel——调用Microsoft.Office.Interop.Excel教程

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 今天我们来聊聊如何通过Dynamo处理Excel数据以及格式&#xff0c;Dynamo自带的节点肯定是不行&#xff0c;所以我们需要来用Python解决&#xff08;当然有个节点包 Bumblebee&#xff0c;我在案例百解教程里有过介绍&a…