在今天这个风和日丽的下午,铁铁遇到了烦心事,那就是,
出现了逻辑上没有问题的问题...
因为铁铁我是第一次碰到这样的情况,就是代码逻辑没得问题,但就是不行,第一次碰到这样的情况多少有些懵逼。
先看一下我的代码:
//定义初始化复位函数
void DS18B20_Reset(void) {
DS18B20_IO_OUT(); //配置为输出
DS18B20_DQ_OUT = 0; //拉低
delay_us(500); //延时500微秒
DS18B20_DQ_OUT = 1; //帮上拉电阻拉高
delay_us(30); //延时30微秒
u8 retry = 0;
DS18B20_IO_IN(); //将总线配置为输入,释放控制器,让给外设
while(DS18B20_DQ_IN && retry < 240) { //检测DS18B20是否在240us以内给低电平应答信号
retry++;
delay_us(1);
}
if(retry >= 240){
printf("Reset Failed.\n");
}
else {
printf("Reset Successfully.\n");
}
//注意这里printf重定向到USART1了,可以直接在串口助手那里看里面的字符串。
}
铁铁我自从写完这个代码,顺利跑起来之后,就没再管过了,我是后续做物联网的时候,这个DS18B20复位函数里面的printf("Reset Successfully.\n")咋串口助手里看的我心烦,我心想没什么用的东西就注释掉吧~
结果一注释不要紧,我陷入了深深的自我怀疑,我是谁,我在哪,我在干什么 (╯‵□′)╯︵┻━┻!!!
注释掉这个printf("Reset Successfully.\n")后,代码竟然跑不起来了!!!!!!
(我小小年纪就能写屎山,好好好)
问题不大,先看看时序图压压惊:
其实从时序图很明显就可以知道,这个🐕输出函数在这里充当了延时函数,当然这是我解决完之后才这样觉着的。。
这是我的解决思路:
1.先定位到底是不是 这个输出函数出现的问题,先针对性的对这个函数进行各种折磨,具体而言就是,注释,在拆开注释,然后换个相同的替代逻辑写一遍,再注释,最终确定了是这个函数出现了问题。
2.既然确定这个函数有问题,我脑子里立马就觉得这个玩意该不会是个充当个“伪延时函数”吧?于是说做就做,然后手动用推挽输出上拉再延时delay_us(30),发现还是报错,就觉着可能不是延时的问题。(这里我犯了个重大错误,就是想当然的觉得延时30微秒就足够了,我当时想着我都帮你上拉电阻给拉上去了,还延时那么长时间干嘛?结果就是各种碰壁之后,又回到了延时函数这里)
3.既然确定是延时函数有问题,就直接delay_us(500),欸,不报错了就~
总结:找到出问题的函数后,不要浮躁,相信自己的总体框架没问题!
既然刚开始就想到是不是输出函数在这里充当了延时函数,为什么不多在延时函数上做文章呢而是跑去找其他问题了呢?