CAN通信的数据帧和远程帧「建议收藏」

(先来一波操作,再放概念)远程帧和数据帧非常相似,不同之处在于:(1)RTR位,数据帧为0,远程帧为1;(2)远程帧由6个场组成:帧起始,仲裁场,控制场,CRC场,应答场,帧结束,比数据帧少了数据场。(3)远程帧发送特定的CANID,然后对应的ID的CAN节点收到远程帧之后,自动返回一个数据帧。环回模式下(方便调试用),设置为发送远程帧:STM32端通过J-LinkRT…

大家好,又见面了,我是你们的朋友全栈君。

(先来一波操作,再放概念)
远程帧和数据帧非常相似,不同之处在于:
(1)RTR位,数据帧为0,远程帧为1;
(2)远程帧由6个场组成:帧起始,仲裁场,控制场,CRC场,应答场,帧结束,比数据帧少了数据场。
(3)远程帧发送特定的CAN ID,然后对应的ID的CAN节点收到远程帧之后,自动返回一个数据帧。

环回模式下(方便调试用),设置为发送远程帧:
STM32端通过J-Link RTT调试软件可以打印出CAN接收到数据(在中断服务函数里面接收);
而通过CANTest软件不能接收到STM32端发送出来的数据,因为远程帧比数据帧少了数据场;
这里写图片描述

正常模式下:通过CANTest软件手动发送一组数据,STM32端通过J-Link RTT调试软件也可以打印出CAN接收到的数据;
这里写图片描述

附上正常模式下,发送数据帧的显示效果:
这里写图片描述

接下来是概念
看完上文,可以简单理解为:
如果A需要B节点向你发送数据!A可以用B节点的ID,发送一个Remote frame(远程帧),B收到A ID 的 Remote Frame 之后就发送数据给A!发送的数据就是数据帧!
远程帧就像命令,命令相应的节点返回一个数据包.

应用(划重点):如果需要CAN上某个节点向你发送数据,你可以用这个节点的ID,发送一个Remote frame(远程帧),这样节点接收到这个Remote frame之后会自动发送数据给你!发送的数据就是数据帧!
主要用来请求某个指定节点发送数据,而且避免总线冲突。

总结(以下内容转载自allen6268198的博客):
由于CAN总线发送帧时,仲裁方法只依靠帧ID号,当有两个相同ID号的帧同时竞争总线时,总线就无法判别出让哪个设备先发送帧,于是就造成总线冲突。

为了总线访问安全,每个发送器必须用独属于自己的ID号往外发送帧(多个接收器的过滤器ID可以重复),(可以让某种信号帧只使用特定的ID号,而每个设备都是某一种信号的检测源,这样就形成某一特定个设备都只是用特定的ID号往总线上发送数据)。

设有设备A,B,且假设A发送信息的ID为A_ID=1,B发送信息时是用的ID为B_ID=2。
A是收取温度信息的设备,B是采集温度信息的设备。
某一时刻,A需要请求B发送温度信息帧。那么A可有2种方法发送请求:
1)A发送一帧数据,ID号为B的ID号(B_ID),数据域内容为【请求温度信息】。
B的过滤器设置为接收B_ID帧。
则A发送后被B接收到,B再以B_ID发送温度信息帧。被A接收到。
这看似完美的过程,其实存在可能的总线冲突:如果A发送帧的同时,B也正要往总线上发送温度帧,则造成总线冲突。
当然也可以采用别的方法来解决此问题,如A发送请求温度帧的ID号改成别的,当然B的过滤器也要做相应的设置。
2)使用远程帧来做信息请求:由于A直接发送B_ID号的数据帧,可能造成总线冲突,但若是A发送远程帧:远程帧的ID号自然是B发送帧使用的ID号(B_ID )。
由于CAN总线仲裁时,数据帧发送的优先级高于远程帧,即使有别的节点设备也在发送以B_ID为ID号的远程帧,因为远程帧除了ID号不同,其他都相同。所以不会造成总线冲突。
当B(前提是以对过滤器设置接受B_ID类型的帧)接受到远程帧后,在软件(注意,是在软件的控制下,而不是硬件自动回应远程帧)控制下,往CAN总线上发送一温度信息帧,即使用B_ID作帧ID号往CAN总线上发送温度信息帧。该帧被A接受到(当然A的过滤器已在发送远程帧之前做了相应设置)。由此可见,远程帧可以使请求更简单,但也非不可代替。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126112.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计

    带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计二阶有源带通滤波器设计1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范…

    2022年5月2日
  • Java设计模式之结构型:代理模式

    Java设计模式之结构型:代理模式

    2021年10月4日
  • [译] AlphaGo 的确是一个大事件

    [译] AlphaGo 的确是一个大事件

    2021年9月16日
  • Mybatis 动态SQL

    Mybatis 动态SQLMybatis动态SQL一.动态SQL数组array使用foreach标签<!–mybatis的集合操作知识点:如果遇到集合参数传递,需要将集合遍历标签:foreach循环遍历集合标签属性说明:1.collection表示遍历的集合类型1.1数组关键字array1.2List集合关键字lis

    2022年6月23日
  • html空格代码_html中空格怎么表示

    html空格代码_html中空格怎么表示html中空格代码的写法一:&nbsp(不换行空格)html中空格代码的写法二:&ensp(半角空格)html中空格代码的写法三:&emsp(全角空格)html中空格代码的写法四:&thinsp(窄空格)html中空格代码的写法五:&zwnj(零宽不连字)说明:&zwnj是一个不打印字符,放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。html中空格代码的写法六:&zwj(零宽连字)说明:&amp

    2022年9月22日
  • Linux下的文本编辑器vi

    Linux下的文本编辑器vi在终端中打开输入vi[文件],启动vi。vi有三种工作模式:命令模式、文本编辑模式、最后行模式。命令模式是启动vi进入的工作模式,在此模式下输入i,I,a,A,o,O,r,R命令中的任何一个即可进入文本编辑模式。此时在状态/命令区出现“—INSERT—”字样。在文本编辑模式下可输入文本内容,用上、下、左、右方向键移动光标,使用【Del】键和【Backspace】键删除字符,按【Esc】键回到…

    2022年7月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号