【CANopen】关于STM32中CanFestival的pdo应用

系列文章目录


文章目录

  • 系列文章目录
  • 一、发送
    • 1、同步传输
    • 2、异步传输
  • 二、接收


使用STM32F407单片机

pdo属于过程数据用来传输实时数据,即单向传输,无需接收节点回应。

一、发送

分为同步传输和异步传输。

1、同步传输

分为循环传输(周期)和非循环传输(非周期)

  1. 非循环传输

接收到同步报文:
1、如果映射值改变了就发送;
2、如果没有改变就不发送。

把整个pdox对应的映射值给发出去

参数配置:

UNS8 Master_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
UNS32 Master_obj1800_COB_ID_used_by_PDO = 0x180;	/* 384 */
UNS8 Master_obj1800_Transmission_Type = 0x0;	/* 0设置为非周期传输 */
UNS16 Master_obj1800_Inhibit_Time = 0x0;	/* 0 */
UNS8 Master_obj1800_Compatibility_Entry = 0x0;	/* 0 */
UNS16 Master_obj1800_Event_Timer = 0x0;	/* 0 */
UNS8 Master_obj1800_SYNC_start_value = 0x0;	/* 0 */

在这里插入图片描述
2. 循环传输

/* index 0x1800 :   Transmit PDO 1 Parameter. */
                    UNS8 Msater_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
                    UNS32 Msater_obj1800_COB_ID_used_by_PDO = 0x180;	/* 384 */
                    UNS8 Msater_obj1800_Transmission_Type = 0x2;	/* 2 接收到两个同步报文发送 */
                    UNS16 Msater_obj1800_Inhibit_Time = 0x0;	/* 0 */
                    UNS8 Msater_obj1800_Compatibility_Entry = 0x0;	/* 0 */
                    UNS16 Msater_obj1800_Event_Timer = 0x0;	/* 0 */
                    UNS8 Msater_obj1800_SYNC_start_value = 0x0;	/* 0 */

Msater_obj1800_Transmission_Type = 1 ~ 253表示接收到1~253个同步报文后发送pdo通信,和映射值变化与否没有关系。

2、异步传输

  1. 内部事件触发

1、定时器触发
Msater_obj1800_Transmission_Type设为0xff,Msater_obj1800_Event_Timer设置定时发送的时间间隔
在这里插入图片描述

2、数据改变

Msater_obj1800_Transmission_Type设为0xff

sendPDOevent(&TestMaster_Data);//循环调用这个函数,如果数据改变则会将数据发出

如果同时有两个TPDO数据改变,调用sendPDOevent只能发出靠前的那个TPDO的数据,连续调用两次会发送先改变的那个,两次调用中间加一点延时既可。

还有一种方法是在DS401这些协议中,暂时还没涉及到。

  1. 远程请求

通过发送与PDO的COB-ID相同的远程帧开触发PDO的发送。

二、接收

接收根据各个RPDO的master_obj1400_COB_ID_used_by_PDO确定,COB-ID确认匹配存入对应的RPDO映射地址中。

  1. 接收到的数据直接读

直接就在映射里面,接收到新数据即覆盖旧数据。

  1. 接收到数据触发回调函数
UNS32 index0x2000_0x01_callback(CO_Data* d, const indextable *table, UNS8 bSubindex)//回调函数
{
	return OD_SUCCESSFUL;//一定要加,不然该PDO对象的下一个参数就无法修改
}

void CAN_INit(void)
{
	RegisterSetODentryCallBack(&CAN_master,0x2000, 1, index0x2000_0x01_callback);//注册回调函数
	//0x2000:映射地址
	//1:子索引
	//index0x2000_0x01_callback:需要注册的回调函数
}

关于注册回调函数中的子索引:
设置为1:即接收的数据存放入子索引1这个位置后触发这个回调函数
也就是可以在接收的任意一个位置注册接收回调函数,想完整接收一帧就放在映射的最后一个索引。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flink精讲】双流Join之Regular Join(即普通Join)

Regular Join 普通Join 通过条件关联两条实时数据流:动态表Join动态表支持Inner Join、Left Join、Right Join、Full Join。 1. Inner Join(Join):只有两边数据流都关联上才输出[L,R] 2. Left Join(Left Outer Join):只要左流有数据即输出[…

我的创作纪念日三年收获和感悟

机缘 我刚开始接触创作也是最近几年开始,当初就是希望自己的收获分享给大家,不仅使自己成长,也可以带着大家一起成长,独乐乐不如众乐乐,人都是自私的以前我都是看到好的知识文章都是自己藏起来,发现收获的…

python类的初始化

问题描述 存在这样的两个类,都在同一个模块a.py内 class YamlGlobal:with open(get_project_path() "/cfg/global.yaml", r, encodingutf-8) as f:glVar yaml.load(f, Loaderyaml.SafeLoader)......class DatabaseGlobal:itd InstanceDao(SQLAlchemy…

qml的操作 -- VS2022开发qml,

在使用VS开发软件的时候一般大型软件都会使用模组的方式。每个模组之间独立开发,关于qml写的UI模组也不例外,如果所有的qml都挤在一个文件夹下也不利于管理,维护起来也比较吃力。比较好的管理方法就是按照功能分布存放在不同的文件夹下。还有…

性能分析与调优: Linux 使用ELRepo升级CentOS内核

目录 一、实验 1.环境 2.agent 服务器使用ELRepo升级CentOS内核 二、问题 1. RHEL-7, SL-7 或者 CentOS-7系统如何安装ELRepo 2.RHEL-8或者RHEL-9系统如何安装ELRepo 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系…

Python中的装饰器

顾名思义,函数装饰器就是对这个函数进行了装饰,比如在函数的前后进行日志打印等。在Python中,装饰器是一种特殊的语法,用于简化函数或方法的定义和调用。装饰器允许你在不修改原始函数代码的情况下,通过在其上应用装饰…

Java Swing手搓童年坦克大战游戏(II)

文章目录 0.初衷1.创建游戏窗口2.创建坦克3.实现坦克移动和发射炮弹4.创建地图4.1关于地图瓦片的尺寸遇到的问题 5.坦克与障碍物的碰撞处理5.1碰撞检测5.2坦克与地图中的瓦片碰撞5.3坦克相互碰撞5.4坦克碰见炮弹5.5坦克拐弯 6.道具6.1星星6.2炸弹6.3钟表6.4城堡6.5坦克6.6无敌圈…

React 实现拖放功能

介绍 本篇文章将会使用react实现简单拖放功能。 样例 布局拖放 LayoutResize.js import React, {useState} from "react"; import { Button } from "antd"; import "./LayoutResize.css";export const LayoutResize () > {const [state,…

canvas 实心文字设置(含最大宽度)的示例

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

【Docker】docker 服务相关命令

目录 1. 启动docker 服务 2.查看docker 服务的状态 3. 停止docker 服务 4.重启 docker 服务 5.开机自启动命令 1. 启动docker 服务 systemctl start docker 2.查看docker 服务的状态 systemctl status docker 3. 停止docker 服务 systemctl stop docker 此时再使用 syst…

RDD入门——RDD 代码

创建RDD 程序入口 SparkContext val conf new SparkConf().setMaster("local[2]").setAppName(spark_context") val sc: SparkContext new SparkContext(conf) SparkContext 是 spark-core 的入口组件,是一个 Spark 程序的入口,在 Sp…

BRF文件数据结构

一.BRF-文件头数据结构 type_mesh "mesh" 网格 type_material "material" 材质struct brf_header{int type_length; //4个字节, type字符串对应长度char* type_name; //根据type_length获取int type_content_num; //4个字节,对应类型所含个数,例如含有模…

数据分析——火车信息

任务目标 任务 1、整理火车发车信息数据,结果的表格形式为: 2、并输出最终的发车信息表 难点 1、多文件 一个文件夹,多个月的发车信息,一个excel,放一天的发车情况 2、数据表的格式特殊 如何分析表是一个难点 数…

UnityVR入门之六 如何让3DUI层级在场景模型之上

一、问题来源 根据 UnityVR入门之五 射线检测交互-CSDN博客 这一章节我们了解到VR要与UI交互需要将Canvas设置为World Space属性,然后使用碰撞盒的方式进行射线交互。 正常我们ui是始终叠加在3d场景之上的,如此设置当ui与场景模型相交就会遮挡穿模 二、解…

git常用命令及概念对比

查看日志 git config --list 查看git的配置 git status 查看暂存区和工作区的变化内容(查看工作区和暂存区有哪些修改) git log 查看当前分支的commit 记录 git log -p commitID详细查看commitID的具体内容 git log -L :funcName:fileName 查看file…

el-form点击提交后把验证失败的数据传给了后端

问题&#xff1a;版本号需要根据后端返回的结果查看是否可用&#xff0c;在这里1.0.0是不可用的&#xff0c;如果点击其他地方则会报红&#xff0c;可是直接点击提交&#xff0c;则会把1.0.0这个错误的数据也提交给后端。 解决方案&#xff1a; html代码&#xff1a; <el…

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

【Pytorch】学习记录分享11——GAN对抗生成网络

PyTorch GAN对抗生成网络 0. 工程实现1. GAN对抗生成网络结构2. GAN 构造损失函数&#xff08;LOSS&#xff09;3. GAN对抗生成网络核心逻辑3.1 参数加载&#xff1a;3.2 生成器&#xff1a;3.3 判别器&#xff1a; 0. 工程实现 原理解析&#xff1a; 论文解析&#xff1a;GAN…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道&#xff0c;app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦&#xff0c;动不动就是用appium写代码脚本维护什么的&#xff0c;不仅步骤繁琐&#xff0c;环境配置方面也是繁琐无比&#xff0c;动不动就与客户…

云计算:OpenStack 分布式架构管理VXLAN网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.各节点新增网卡准备VXLAN网络 3.控制节点配置私有网络 4.计算节点1配置私有网络 5.计算节点2配置私有网络 6.重启服务 7.修改Dashboard 8.新建项目&#xff08;租户&#xff09;及用户 9.新建网络与子网 10.新建实例 11.新建路由 12.新增浮…