CAN网络上新增加的设备与网络上已有设备MAC地址冲突的软件解决方案
已知 1号的CAN节点的地址是0x1f 2号的CAN 节点的地址是0x1f

要达到的要求是 假设 网络上 CAN1 节点已经工作了,我现在需要在网络上接入CAN2节点。
那么CAN2节点首次上电的时候 需要给网络上的其他CAN节点 发送 数据帧(数据帧叫检测ID号帧)
,该数据帧 要求 (网络上与CAN2 节点的物理MAC地址 相同的CAN节点) 发送 响应帧
(该响应帧 是 刚上电的CAN2节点,发送给网络上其他节点的响应帧 ,由其他节点处理以后的应答帧)
若假设CAN2 接点的物理ID 已经与CAN1节点的物理地址一样,则CAN2 节点 一直进入程序死循环,直到改变了CAN节点2 自己的 物理 MAC 地址以后(通过软件固化设置)。 才会跳出死循环,然后进行正常的接收 发送 工作。
本版本程序 ,在这个功能 上 ,采用的是 主机 和 从机 使用的一个程序。
试验平台 两个51单片机
主机 的 ID MAC 地址 是0x1f 从机的 ID MAC 地址 也是 0x1f
单片机的接线方式 如下

1号CAN节点外部5V供电正常以后, 停一段时间,再给外部的5V电源供电 。
则可以看到2号CAN节点的数码管一直显示的是4 表示它一直在循环体里面

基于ICAN 协议

2号CAN节点发送的 请求网络上其他节点 发送的(命令帧) 格式 应该是
下图黄色 为 源节点 编号 即本机的MAC地址
下图绿色 为 目标节点 编号 即邮件要发送的目的地址
下图红色 为 ACK= 0 表示本帧需要应答 是命令帧
ACK= 1 表示本帧是应答帧 不需要应答
下图蓝色为 功能代码 其中 07 表示 功能为 MAC ID 检测
下图紫色为 为资源节点编号
|
位字节 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
字节1 |
帧信息 |
FF 1 |
RTR 0 |
X |
X |
数 0 |
据 1 |
长 1 |
度 0 |
|
字节2 |
帧ID1 |
ID28 0 |
ID27 0 |
ID26 0 |
ID25 1 |
ID24 1 |
ID23 1 |
ID22 1 |
ID21 1 |
|
字节3 |
帧ID2 |
ID20 0 |
ID19 0 |
ID18 0 |
ID17 1 |
ID16 1 |
ID15 1 |
ID14 1 |
ID13 1 |
|
字节4 |
帧ID3 |
ID12 ACK 0 |
ID11 0 |
ID10 1 |
ID9 1 |
ID8 1 |
ID7 1 |
ID6 1 |
ID5 1 |
|
字节5 |
帧ID4 |
ID4 0 |
ID3 1 |
ID2 1 |
ID1 1 |
ID0 0 |
不使用 |
不使用 |
不使用 |
|
字节6 |
数据1 |
||||||||
|
字节7 |
数据2 |
||||||||
|
字节8 |
数据3 |
||||||||
|
字节9 |
数据4 |
||||||||
|
字节10 |
数据5 |
||||||||
|
字节11 |
数据6 |
||||||||
|
字节12 |
数据7 |
||||||||
|
字节13 |
数据8 |
||||||||
03e3e7ee 是命令帧的ID
程序中 发送的命令处理如下


综上 该帧消息的ID号是 03e3e7ee
下面看响应帧 , 本次的主机 从机 发送程序 用的是 一个 程序
当主机1 响应从机2 的响应命令了以后 发送响应帧
主机1里面执行的程序分支如下:
是 主程序中 while(1) 循环的部分

1号机发送的响应帧 与 2号机器 先前发送的应答帧 其实仅仅是 ACK 变为了1
|
位字节 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
字节1 |
帧信息 |
FF 1 |
RTR 0 |
X |
X |
数 0 |
据 1 |
长 1 |
度 0 |
|
字节2 |
帧ID1 |
ID28 0 |
ID27 0 |
ID26 0 |
ID25 1 |
ID24 1 |
ID23 1 |
ID22 1 |
ID21 1 |
|
字节3 |
帧ID2 |
ID20 0 |
ID19 0 |
ID18 0 |
ID17 1 |
ID16 1 |
ID15 1 |
ID14 1 |
ID13 1 |
|
字节4 |
帧ID3 |
ID12 ACK 1 |
ID11 0 |
ID10 1 |
ID9 1 |
ID8 1 |
ID7 1 |
ID6 1 |
ID5 1 |
|
字节5 |
帧ID4 |
ID4 0 |
ID3 1 |
ID2 1 |
ID1 1 |
ID0 0 |
不使用 |
不使用 |
不使用 |
|
字节6 |
数据1 |
||||||||
|
字节7 |
数据2 |
||||||||
|
字节8 |
数据3 |
||||||||
|
字节9 |
数据4 |
||||||||
|
字节10 |
数据5 |
||||||||
|
字节11 |
数据6 |
||||||||
|
字节12 |
数据7 |
||||||||
|
字节13 |
数据8 |
||||||||
该响应帧的ID 号是 037e3f7ee


同时 由于 存在 下面的语句 发送响应帧的 1号 单板 的数码管 变为6

阶段3 刚挂在网络上的2号机器 接收到已经挂在网上的1号机器 的应答以后,
注意 此时 的2 号机器 还处于 do{} while() 循环里, 所以 在中段程序里 执行的
是 if(Check_MACID_Process_Flag==1) {} 分支

同时 他还在执行 while(1) 之前 的 do{} while () 循环里

运行结果如下图

最后 再次用简短的话语总结
CAN通讯 协议的前提 条件 是
发送命令帧 有 源地址(本机的MAC地址1) 和 目标地址
响应命令帧 有 源地址(本机的MAC地址2) 和 目标地址
一般 MAC 地址1 与MAC 地址2 肯定是不相同 。不然无法保证通讯网络里 节点的MAC地址 唯一。
但是 假设 实际情况中出现了 已经工作良好的网络上, 需要挂接上一个新的CAN设备,且该设备与该网络上的某个CAN 节点的MAC地址一致,那么我做程序的时候,这个新挂接上来的 CAN设备 发送 的目标节点的地址与 源节点的地址 肯定是一致的。
因为我要寻找的就是 该网络上 与 挂接的新 CAN设备 物理地址 一致的设备。
同时网络上已有的那个设备(该设备的ID与新挂接设备的ID 冲突)发送的目标地址与源地址也必须与新挂接 设备的ID 一致。
于是 就有了 新挂接CAN设备的发送程序, 与 网络上与新挂接设备地址 冲突的节点 可以共用一个子程序

同时 子程序里面的 源地址 与 目标地址的设定必须 要与当前本机的MAC一致都一样。
请把最终的话语 用清晰 明了的语言描述清楚 不要向下面那样

养成良好的严谨的习惯很重要。
硬件平台的视频 以及 程序 已经放在网盘。以后备用。 含有我拍摄的视频。
CAN网络上新增加的设备与网络上已有设备MAC地址冲突的软件解决方案的更多相关文章
- 在Android4.4上新增加keycode
keycode是android定义好的,但是有时候无法满足需要,进行定制化难免会涉及到新增加keycode.分成两部分,驱动和framework,这里主要讲解framework部分: 一.驱动部分: ...
- 数据中心网络技术新贵:VXLAN与园区网络虚拟化
摘要:为了应对传统数据中心网络对服务器虚拟化技术的限制,VXLAN技术应运而生. 1 概述 传统数据中心网络面临的问题 虚拟机规模受设备表项规格限制 在传统二层网络中,交换机通过查询MAC地址表来转发 ...
- 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)
第10章 RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...
- 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)
第9章 RL-TCPnet网络协议栈移植(uCOS-III) 本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移 ...
- 【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)
第8章 RL-TCPnet网络协议栈移植(RTX) 本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要 ...
- 【安富莱】【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)
第7章 RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...
- 网络协议 2 - IP 地址和 MAC 地址
了解完网络协议,我们会发现,网络通信的五层模型里,有两个很重要的概念:IP 地址和 MAC 地址. 那么 IP 地址是怎么来的,又是怎么没的?MAC 地址与 IP 地址又有什么区别? 这回答上面问题前 ...
- 让BLE设备的名称包含MAC地址
对于研发和测试BLE来说,经常看到同名的设备,是极为不方便的,一大堆设备同时上电会让同事不知道哪一个设备才是自己真正想操作的目标.再说一下小米手环,家中有三支小米手环,打开设备搜索全是“MI”,都不知 ...
- Solaris10上如何识别新增加的HDLM LUN
先在磁盘阵列上将新加LUN映射给主机组,然后在光纤交换机上增加相关zone信息.以下是Solaris10上需要执行的操作步骤. 在Solaris10上重新扫描磁盘 -bash-3.2# cfgadm ...
随机推荐
- InnoDB中一棵B+树能存多少行数据
https://www.jianshu.com/p/3578beed5a68 https://www.cnblogs.com/tongongV/p/10952102.html InnoDB 存储引擎最 ...
- EC20的低功耗模式
EC20的支持以下几种工作模式,睡眠模式包括MCU主机睡眠和EC20睡眠. 当MCU主机不睡眠时,通过AT+QICSK =1(发送完之后串口被禁用不再响应AT指令),DTR=1(投票EC20可以进入睡 ...
- JQuery - $(this) 加 siblings() 的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- treap(堆树)
# 2018-09-27 17:35:58 我实现的这个treap不能算是堆.有问题 最近对堆这种结构有点感兴趣,然后想用指针的方式实现一个堆而不是利用数组这种结构,于是自己想到了一个用二叉树结构实现 ...
- 使用MyCat实现MySQL读写分离
说明 配置MyCat读写分类前需要先配置MySQL的主从复制,参考我上一篇的文章,已经做了比较详细地讲解了. 环境 centos7.MySQL5.7.mycat1.6 配置MyCat账号密码和数据库名 ...
- 第2章 PLC1200 与HMI (TP900) 组合仿真连接 编写1200程序,编写HMI 仿真过程拍摄视频
博途V13 与 WINCC PROFESSIONAL V13 创建一个PLC工程 和屏幕的 练习. 在做S1200与 HMI的仿真之前 需要设置控制面板 设置PG/PC口 巡视窗口用于看设备的一些属性 ...
- [Android]ListView中分割线的设置
1.在布局文件中ListView元素中通过属性设置 android:divider="#fffff" 分割线颜色 android:dividerHeight="1px& ...
- 090、Java中String类之判断两个int型整数是否相等
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 使用总结:java多线程总结 <转载>
转载 https://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html java多线程总结 2011-08-28 20:08 Ro ...
- 嵊州普及Day5T2
题意:将(w,h)的纸条折成(W,H),最少需几步. 思路:横竖互不干扰,然后最多可折int型一半,拿个函数判断两次比较即可,然后折不了的条件是需要的矩形大于给的矩形. 见代码: #include&l ...