DS18b20 BBB проблема с чтением температуры в коде C - PullRequest
0 голосов
/ 05 мая 2019

Я не могу прочитать результаты измерения температуры с датчика температуры DS18B20, установленного в BeagleBone black. Я использую w1.dts как здесь: http://www.bonebrews.com/temperature-monitoring-with-the-ds18b20-on-a-beaglebone-black/ И мой код C отсюда: http://bradsmc.blogspot.com/2014/06/c-program-to-read-multiple-ds18b20-1.html

Вывод в консоли выглядит так:

 Found 1 devices
 <blank line>
 <blank line>

Я могу прочитать температуру, используя команду

cat /sys/devices/w1_bus_master1/28-00000624ec04/w1_slave

И мои показания:

74 01 4b 46 7f ff 0c 10 55 : crc=55 YES
74 01 4b 46 7f ff 0c 10 55 t=23250

Я уже изменил код пути на:

char path[] = "/sys/devices/w1_bus_master1/";
sprintf(newDev->devPath, "%s/%s/w1_slave", path, newDev->devID);




int8_t readTemp(struct ds18b20 *d) 
{
 while(d->next != NULL)
    {
    d = d->next;
    int fd = open(d->devPath, O_RDONLY);

    if(fd == -1)
        {
          perror ("Couldn't open the w1 device.");
                 return 1;
        }
    char buf[256];
    ssize_t numRead;
    while((numRead = read(fd, buf, 256)) > 0) 
            {
            strncpy(d->tempData, strstr(buf, "t=") + 0, 4);
            float tempC = strtof(d->tempData, NULL);
            printf("Device: %s  - ", d->devID);
            printf("Temp: %.3f C  ", tempC / 1000);
            printf("%.3f F\n\n", (tempC / 1000) * 9 / 5 + 32);
            }
         close(fd);
        }
 return 0;
}

Но функция readtemp по-прежнему не показывает мне фактическую температуру.

Я обнаружил, что в этой функции:

int8_t findDevices(struct ds18b20 *d)
{
    DIR *dir;
        struct dirent *dirent;
        struct ds18b20 *newDev;
        char path[] = "/sys/devices/w1_bus_master1";
        int8_t i = 0;
        dir = opendir(path);
        if (dir != NULL)
        {

            while ((dirent = readdir(dir)))
            {

                // 1-wire devices are links beginning with 28-
                if(dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL)
                {
                    printf("DevId bef");
                    newDev = malloc(sizeof(struct ds18b20));
                    strcpy(newDev->devID, dirent->d_name);
                    // Assemble path to OneWire device
                    sprintf(newDev->devPath, "%s/%s/w1_slave", path, newDev->devID);
                    i++;

                    newDev->next = 0;
                    d->next = newDev;
                    d = d->next;
                }
                else
                {

                }
            }
            (void) closedir(dir);
        }
        else
        {
            perror ("Couldn't open the w1 devices directory");
            return 1;
        }
        return 1;
}

Результат:

if(dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL)

Если d_name = 28-00000624ec04, параметры dirent->d_type = 4 и DT_LNK && strstr(dirent->d_name, "28-") = 1, то dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") не соответствует действительности

1 Ответ

0 голосов
/ 09 мая 2019

Может быть, это поможет кому-то с этой проблемой, потому что я решил это.

Оригинальный цикл выглядел так:

   if(dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL)

Я изменил его на:

 if(dirent->d_type == 4)
        {
          if (strstr(dirent->d_name, "28-") != NULL)
          {

После этого все работает отлично.

...