关于DHT11移植至UCOS系统读不到数据解决方法

2019-08-17 07:02发布

如题,解决方法如下:
1.将原来的void DHT11_Rst(void)函数改为如下,防止delay_ms(20)发生任务调度,打断DHT11读写时序 ;
void DHT11_Rst(void)
{
        int i;
        DHT11_IO_OUT();         //SET OUTPUT
    DHT11_DQ_OUT=0;         //拉低DQ
//    delay_ms(20);            //拉低至少18ms    防止用实时系统发生任务调度影响DHT11读写时序
        for(i=0;i<2000;i++)
                delay_us(1);
    DHT11_DQ_OUT=1;         //DQ=1
        delay_us(30);             //主机拉高20~40us
}
2.在调用DHT11_Read_Data()函数的地方用临界段保护,防止其他中断打断DHT11读写时序;
// 温湿度任务
_DHT11 Temp_Humi;               
static void dht11_task(void *p_arg)
{       
        OS_ERR err;       
        CPU_SR_ALLOC();
       
        while(1)
        {
                OS_CRITICAL_ENTER();        //进入临界区
                DHT11_Read_Data(&Temp_Humi);
                OS_CRITICAL_EXIT();        //退出临界区                        
                OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);//延时100ms
        }
}

3.亲测可用,不过数值误差比较大。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。