0

我在嵌入式定制板上使用 Debian (8.3.0-6) 并使用 dht11 传感器。 简而言之, 我需要从 GPIO 引脚读取 40 位,每个位最多需要 70 微秒。当最大 28us 或 70us 位电平为高时,分别表示为逻辑 0 或 1。(所以我对每个位都有一个超时控制器,如果一个位需要超过 80us,我需要停止该过程。)。 在我的情况下,有时我可以正确读取所有 40 位,但有时我不能这样做,并且 libgpiod 的功能缺少该位(我的代码如下)。我试图弄清楚为什么我无法阅读并失去一点,这是什么原因。但我还没有找到一个明智的答案。所以我想知道我错过了什么?,GPIO编程的正确方法是什么?在此处输入图像描述 在此处输入图像描述gpiod_line_get_value(line);

这是我想向您展示的内容,我如何理解我缺少的东西?每当我捕捉到一点时,我都会在位的上升沿和下降沿设置和重置另一个 GPIO 引脚(这样我就可以看到哪个位丢失了)。此外,据我所知,我总是连续丢失一位上的两个边沿或两位上的一个边沿(上升和下降或下降和上升)。在第一张图片中,您可以看到我错过了哪一位,第二张是当我正确读取所有位时。

在此处输入图像描述

在此处输入图像描述

这是我的代码:

//********************************************************* Start reading data bit by low level (50us) ***************************
    for (int i = 0; i < DHT_DATA_BYTE_COUNT ; i++) //DHT_DATA_BYTE_COUNT = 5
    {
        for (int J = 7; J > -1; J--)
        {
             GPIO_SetOutPutPin(testPin); //gpiod_line_set_value(testPin, 1);
             int ret;
             start = micros();
             do
             {
                 ret = GPIO_IsInputPinSet(dht11pin);//gpiod_line_get_value(dht11pin);
                 delta = micros() - start;
                 if(ret == -1)
                 {
                     err_step.step = 9;
                    err_step.ret_val = -1;
                    return -1;
                 }
                if(delta > DHT_START_BIT_TIMEOUT_US) //80us
                {
                    err_step.step = 10;
                    err_step.ret_val = -2;
                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                    GPIO_ResetOutPutPin(testPin);
                    return -2;
                }
             }while(ret == 0);


                GPIO_ResetOutPutPin(testPin);
                err_step.ret_val = 10;


                GPIO_SetOutPutPin(testPin);

            start = micros();
            do
             {
                 ret = GPIO_IsInputPinSet(dht11pin);
                 delta = micros() - start;
                 if(ret == -1)
                 {
                     err_step.step = 11;
                    err_step.ret_val = -1;
                    return -1;
                 }
                 if(delta > DHT_BEGIN_RESPONSE_TIMEOUT_US) //80us
                {
                    err_step.step = 12;
                    err_step.ret_val = -2;
                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                    return -2;
                }
             }while(ret == 1);

                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                GPIO_ResetOutPutPin(testPin);
                err_step.ret_val = 10;

            (delta > DHT_BIT_SET_DATA_DETECT_TIME_US) ? bitWrite(dht11_byte[i],J,1) : bitWrite(dht11_byte[i],J,0);
        }
    }
4

0 回答 0