最近我做了个收音机,之前是没有自动选台功能的,在短波频段搜索下一个电台非常慢。
于是我给它增加了自动选台的功能,实现了自动选台算法。之后又发现了新的问题,在短波段
由于频段范围大,检索非常耗时间,又因为该频段内涵盖了很多空白频段(这些频段没有设置电台,所以自动搜索程序在该区间是查找不到满足需求的电台的),因此会在这些区间检索的时候呈现一种假死状态。
电台检索程序是在一个死循环内一直判断该频道是否存在电台信号的,如果不存在就步进到下一个频道,然后调用判断函数判断是否符合存在电台的特征。
因此遇到了长空白段,可能会假死10到30秒,这就很难办了,怎么解决呢?
我想实现的功能是搜索时间控制啊5秒左右,超过了5秒就退出检索,跳出死循环。
于是有方法了,设置计时器,计时满5秒后跳出。
if((millis()-currentMillis)>=1000)//防假死,进入搜索死循环内超过5秒就退出,可以避免在短波空白波段搜台时候假死
{
currentMillis=millis();
timer_wait++;
if(timer_wait>5)
{
*iFrequency = NextFreq;
return(1);
}
}
实现代码如上所示,使用millis()计时器函数,进行时间查询,每隔一秒就刷新一下当前计时变量,当计时满5秒后,传递出此刻的频率值,并返回1,跳出死循环函数。
怎么样,这个思路如何,希望对大家有帮助。
实测,再也不会卡死了,如果5秒内查找到了新的电台频率,就在其他函数跳出循环结束函数。如果在5秒后没找到电台也结束循环,更新频率,跳出函数
|