dht11的问题,整了一晚上了。

#驱动drv.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <asm-generic/uaccess.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>

#define DEVICE_NAME "dth"
#define DTH_GPIO    32
unsigned char buf[5];

void gpio_output(int value)
{
    gpio_direction_output(DTH_GPIO,value);
}
int read_one_bit(void)
{
    gpio_direction_input(DTH_GPIO);
    return gpio_get_value(DTH_GPIO);
}
unsigned char read_data(void)
{
    unsigned char data=0;
    unsigned char flag=0;
    gpio_output(0);
    mdelay(20);
    gpio_output(1);
    udelay(40);
    if(read_one_bit()==0)
    {
            int i=0;
            int num=0;
            int nums=0;
            while(!gpio_get_value(DTH_GPIO))
                {
                    i++;
                    udelay(5);
                    if(i>20)
                        {
                            break;
                        }
                }
            i=0;
            while(gpio_get_value(DTH_GPIO))
                {
                    i++;
                    udelay(5);
                    if(i>20)
                        {
                            break;
                        }
                }
            i=0;    
            memset(buf,0,sizeof(buf));
        for(nums=0;nums<5;nums++)
        {

            for(num=0;num<8;num++)
            {
                while(!gpio_get_value(DTH_GPIO))
                    {
                        i++;
                        udelay(5);
                        if(i>10)
                            {
                                printk(KERN_INFO "time out\n");
                                break;  
                            }
                    }
                udelay(30);
                if(gpio_get_value(DTH_GPIO))
                    {
                        data=0x01;
                    }
                else
                    {
                        data=0;
                    }
                data<<=1;
                data|=flag;
            }
            buf[nums]=data;
        }
        return data;
    }
    else
    {
        printk("return data failed!\n");
        return 0;
    }
}
static ssize_t dth_misc_read(struct file *file, char __user *buff, size_t size, loff_t *f_ops)
{   
    unsigned char dat[5];
    int ret=0;
    *dat=read_data();
    if((dat[0]+dat[1]+dat[2]+dat[3])==dat[4])
        {
            ret=copy_to_user(buff,dat,4);
            if(ret<0)
                {
                    printk("copy data failed!\n");
                    return ret;
                }
        }
    else
    return 0;
}
static int dth_misc_open(struct inode *inode, struct file *file)
{
    gpio_request(DTH_GPIO,"dth11");
    gpio_output(1);
    printk("device opened!\n");
    return 0;
}
static int dth_misc_close(struct inode *inode, struct file *file)
{
    printk("device release!\n");
    return 0;
}


static struct file_operations dth_opr = {
        .owner =THIS_MODULE,
        .open =dth_misc_open,
        .release = dth_misc_close,
        .read = dth_misc_read,
};
static struct miscdevice dth_misc = {
        .minor=MISC_DYNAMIC_MINOR,
        .name=DEVICE_NAME,
        .fops=&dth_opr,

};

static int __init dth_device_init(void)
{
    int ret;
    ret=misc_register(&dth_misc);
    if(ret<0)
        {
            printk(KERN_INFO "register misc_device failed!\n");
        }
    return 0;
}
static void __init dth_device_exit(void)
{
    misc_deregister(&dth_misc);
}
module_init(dth_device_init);
module_exit(dth_device_exit);
MODULE_LICENSE("GPL");


##测试程序
    #include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>

int main()
{
    int fd,ret;
    unsigned char buf[4];//数据缓存区

    fd = open("/dev/dth",O_RDONLY);
    if(fd < 0){
        printf("/dev/dht11 open fail\n");
        return 0;       
    }   

    while(1){
        printf("dht11fd = %d\n",fd);
        ret = read(fd,buf,sizeof(buf));
        if(ret < 0)
            printf("read err!\n");
        else{   
            printf("humidity = %d.%d%%\ttemp = %d.%d\n", 
                buf[0], buf[1],buf[2], buf[3]);
        }
        sleep(3);//采样时间不低于1S
    }

    close(fd);

    return 0;
}

#结果如下

/mnt # ls
dthdrv.ko   dthmisc.ko  test
/mnt # insmod dthdrv.ko
/mnt # ./test
device opened!
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127%     temp = 220.190
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127%     temp = 220.190
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127%     temp = 220.190

有大哥给看下一下是什么情况吗。

https://zhidao.baidu.com/question/496265429037023052.html