在遍历二叉树时,记录所走的路径和搜索到的叶子结点数,可以得到从器件的注册码和从器件数量。
第一次搜索从器件的注册码时,如果左子结点和右子结点都存在,需要记录该分叉结点的深度,并沿左子树的方向向下搜索,当搜索深度达到64时,获得一个从器件的注册码,并取出该搜索路径最后的分叉结点的深度,然后主器件执行第二次搜索过程。在该搜索过程中,如果结点的深度值小于最后一个分叉结点的深度,则发送上次搜索到的在最后一个分叉结点前的注册码的相应位;如果结点的深度值等于最后一个分叉结点的深度,则发送上次搜索到的在最后一个分叉结点处发送的数据的反码,并且删除该分叉结点的记录,如在后面的搜索中遇到分叉结点,同样需要记录分叉结点的深度。这样,每搜索到一个深度为64的叶子结点,就会得到一个从器件的注册码,一直搜索到记录中没有分叉结点为止。

网上找到的代码,有些bug,改了一下。

void Find_Serial() // find ds18b20 rom {vu8 read_bit[64]; // record the branch infovu8 n; // count var u8 i; // circle var vu8 k; // byte num of 64bit rom idvu8 k1=1; // identifier num of 18b20vu8 record; // the deepest branch pointvu8 temp; // temporary varreset_1820_1(); // resetwrite_1820_1(Search_ROM); // 'search rom' cmdwhile (1){for (n=1;n<65;n++){k=(n-1)/8; // u8 arr[][k]temp=Read_One_Bit(); // read one bit()temp=temp<<1 read_one_bit="" serial="" k1-1="" k="">>=1;if(temp==0x02) //00 more 0x00//01 '0' 0x01//10 '1' 0x02//11 nor 0x03{serial[k1-1][k] |= 0x80; // record '1'Write_One_Bit(1); // write '1'read_bit[n]=0; // no branch point}if (temp==0x01) {serial[k1-1][k] &= 0x7f; // record '0'Write_One_Bit(0); // write '0'read_bit[n]=0; // no branch point}if(temp==0x00) {if(k1 == 1){serial[k1-1][k]=serial[k1-1][k]&0x7f; // write the new bit '0' of idWrite_One_Bit(0x00); read_bit[n]=1; // mark branch point }else if (n{temp=(serial[k1-2][k]>>((n-1)%8))&0x01; // get last pathif(temp == 1)serial[k1-1][k] |= 0x80; // write the new bit '1' of id elseserial[k1-1][k] &= 0x7f; // write the new bit '0' of id Write_One_Bit(temp); }else if (n>record) // have arrived the last marked baranch point yet {serial[k1-1][k] &= 0x7f; // write the new '0' bit of idWrite_One_Bit(0); // choose the left pathread_bit[n]=1; // mark the branch point}else { temp=(serial[k1-2][(n-1)/8]>>((n-1)%8))&0x01; if (temp == 1){serial[k1-1][(n-1)/8] &= 0x7f;Write_One_Bit(0);}else if (temp == 0){serial[k1-1][(n-1)/8] |= 0x80;Write_One_Bit(0x01);}read_bit[n]=0; // clear the mark}}} if (n>64){for (i=64;i>0;i--) // find the deepest branch piont{if (read_bit[i]!=0){record=i;n=1;read_bit[i]=0; // clear the branch point infobreak;}else{ record=0; } // all the path have searched}} if (record!=0) {reset_1820_1(); // resetwrite_1820_1(Search_ROM); // research the rom idk1+=1;}else{break; // all the decive id on the chain have writed in the array serial[k][]}} }</1>

18B20,search rom命令,遍历搜索相关推荐

  1. ubuntu安装软件包命令_从Ubuntu命令行搜索安装软件包

    ubuntu安装软件包命令 When you are trying to install software on Ubuntu or Debian linux using the apt-get pa ...

  2. Stata:外部命令的搜索、安装与使用

    原文链接:https://www.lianxh.cn/news/c2ab130d9873d.html 目录 1. 路径设置 2. 外部命令的下载 2.1 ssc 命令 2.2 search 命令 2. ...

  3. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  4. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  5. linux命令查找行数命令,Linux中用grep命令来搜索单词及统计匹配的行数

    使用 grep 命令来搜索多个单词要使用 grep 命令来搜索多个字符串或单词,我们该怎么做?例如我想要查找 /path/to/file 文件中的 word1.word2.word3 等单词,我怎么样 ...

  6. linux中的变量文件路径,Linux库文件和Shell可执行程序命令文件搜索路径变量的设置...

    一.库文件的搜索路径: 1.在配置文件/etc/ld.so.conf中指定动态库搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存 ...

  7. Linux命令大全搜索网站模板

    介绍: 一款Linux命令大全搜索网站模板,HTML静态模板,可搜索,点击查看详细内容. 当前共搜集了570 多个 Linux 命令,内容包含 Linux 命令手册.详解.学习,内容来自网络和网友的补 ...

  8. 使用Google Custom Search打造站内搜索

    链接: Google AJAX 搜索 API 参考: http://www.google.com/cse/docs/cref.html?hl=zh-CN http://www.google.com/c ...

  9. Mac通过命令行搜索文件

    你好,我是悦创 . 最近在做 Python 简单的图像识别 ,需要用到某些库和软件,有时候需要查找路径.所以就有了如下内容. 通过 Find 命令搜索文件 find 命令非常高效,并且使用简单.fin ...

最新文章

  1. 【组队学习】【34期】百度飞桨AI达人创造营
  2. 面试官:说一下限流、熔断、高可用?好多人一脸懵!
  3. 学计算机出来的大佬,学计算机专业的大佬能否解答一下
  4. 基于TestNG 与Selenium 的自动化测试设计与实施
  5. java如何获取明天的时间_java获取各种格式的时间,获取昨天明天日期,获取一天的开始结束时间...
  6. 2019-04-12 cookie基础
  7. mysql防注入 php_PHP使用PDO实现mysql防注入功能详解
  8. 安卓toast文字提示
  9. JAVA加密算法系列-AesCBC
  10. 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment
  11. android system.img编译,快速编译system.img和boot.img的方法
  12. html清除内部所有补白,如何清除行内元素之间的HTML空白
  13. 【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址
  14. 多金的ToG项目总结——数字人民币
  15. 高等代数 :2 行列式
  16. Docker curriculum (2): 构建自己的镜像
  17. 物联网---网络通信协议
  18. 数据库课程设计(电脑配件库存管理系统)
  19. 华为正式加入互联网路由安全规范 MANRS
  20. python是人都能学会_人人都能学会的python编程教程15:高级特性2

热门文章

  1. php获取input file路径,JavaScript_JS获取input file绝对路径的方法(推荐),最近因需要上传文件到oracle blo - phpStudy...
  2. flex弹性盒子中flex-grow与flex的区别
  3. 基于QC3.0诱骗功能的便携式电烙铁代码讲解
  4. Acwing1101. 献给阿尔吉侬的花束
  5. react之纯函数、函数组件
  6. 使用html css实现180箭头旋转,纯CSS实现箭头旋转
  7. [] 与 [[ ]]
  8. 脾和胃各自的功能是什么?
  9. Markdown博客 设置字体大小、颜色、类型等样式
  10. 计算机 电磁兼容 标准,计算机系统中的电磁兼容EMC问题解析