在遍历二叉树时,记录所走的路径和搜索到的叶子结点数,可以得到从器件的注册码和从器件数量。
第一次搜索从器件的注册码时,如果左子结点和右子结点都存在,需要记录该分叉结点的深度,并沿左子树的方向向下搜索,当搜索深度达到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. 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
  2. 《Java8实战》-第六章读书笔记(用流收集数据-01)
  3. Python基础第19天
  4. zabbix之使用proxy实现分布式监控
  5. MOSS推荐之1-WSS V3服务器架构
  6. html(3)标签(2)
  7. matlab 树状链表,多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(5)编码过程——精细扫描...
  8. mysql的等号是什么意思_整理思维——等于等于等于?{MySQL条件等号的异常}
  9. #研发解决方案#共享能力的数屏
  10. ASP.NET页面间的传值的几种方法
  11. basler相机参数简要中文说明_basler相机参数设置
  12. peek java linkedlist_Java LinkedList peek()方法
  13. 自媒体数据运营saas_向媒体宣传您的SaaS
  14. 嵌入式linux开发环境搭建(VMware16.0.0+Ubuntu16.04.3_X64)
  15. 百度云使用QQ失败怎么办?
  16. 2023-ISCC信息安全与对抗竞赛wp-misc(详解,有脚本( •̀ ω •́ ),脚本解析,有附件)
  17. DiDi Food中的智能补贴实战漫谈
  18. android 日倒计时计算器,分秒倒数日app下载-分秒倒数日(时间计算器)安卓版下载 v2.0.0安卓版_5577安卓网...
  19. 幻想-FLEX 3基础视频教程 持续更新中
  20. HDR / WCG 关键技术分析及标准化进展

热门文章

  1. Mac系统重装指南(不抹盘):2023版保姆级教程,轻松解决macOS问题并保留数据和软件
  2. 滴滴打车每天自动领券
  3. java程序无法访问远程数据库或远程服务(VPN)
  4. 公众号开发(4) —— 使用Senparc.Weixin SDK进行模板消息推送
  5. Android-第十一节网络请求第三方框架-xutils3
  6. centos实现后台运行jar包
  7. 使用 Java 对图像进行各种处理
  8. vs单步调试及断点调试基本介绍(入门版详细图文介绍)
  9. es6如何使用padStart()和padEnd()方法
  10. 网络营销和整合营销具体是什么?