From 5e9d03d507aad324a803eb8795e0eed6fb671761 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Mon, 10 Jul 2023 15:24:52 +0800 Subject: [PATCH] Merge branch 'master' of http://master.iot-yun.club:8088/r/raspberrypi --- apue/1.File_IO/ds18b20.c | 74 +++++++++++++++++++----------------- 1 files changed, 39 insertions(+), 35 deletions(-) diff --git a/apue/1.File_IO/ds18b20.c b/apue/1.File_IO/ds18b20.c index 447bf28..0ff2a34 100644 --- a/apue/1.File_IO/ds18b20.c +++ b/apue/1.File_IO/ds18b20.c @@ -1,14 +1,14 @@ /********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio + * Copyright: (C) 2022 LingYun IoT System Studio * All rights reserved. * * Filename: ds18b20.c - * Description: This file is temperature sensor DS18B20 code - * + * Description: This file is DS18B20 temperature sensor example source code. + * * Version: 1.0.0(2018/10/14) * Author: Guo Wenxue <guowenxue@gmail.com> * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * + * ********************************************************************************/ #include <stdio.h> @@ -24,40 +24,41 @@ int main(int argc, char *argv[]) { - float temp; + float temp; - if( ds18b20_get_temperature(&temp) < 0 ) - { - printf("ERROR: ds18b20 get temprature failure\n"); - return 1; - } + if( ds18b20_get_temperature(&temp) < 0 ) + { + printf("ERROR: ds18b20 get temprature failure\n"); + return 1; + } - printf("DS19B20 get temperature: %f ℃\n", temp); - return 0; + printf("DS18B20 get temperature: %f 'C\n", temp); + return 0; } /* File Content: - pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave + pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave 3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES 3a 01 4b 46 7f ff 0c 10 a5 t=19625 */ int ds18b20_get_temperature(float *temp) { - char w1_path[50] = "/sys/bus/w1/devices/"; + const char *w1_path = "/sys/bus/w1/devices/"; + char ds_path[50]; char chip[20]; char buf[128]; DIR *dirp; struct dirent *direntp; int fd =-1; char *ptr; - float value; int found = 0; + int rv = 0; if( !temp ) { - return -1; + return -1; } /*+-------------------------------------------------------------------+ @@ -76,45 +77,48 @@ /* find and get the chipset SN filename */ strcpy(chip,direntp->d_name); found = 1; - break; + break; } } closedir(dirp); if( !found ) { - printf("Can not find ds18b20 in %s\n", w1_path); - return -3; + printf("Can not find ds18b20 in %s\n", w1_path); + return -3; } /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */ - strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path)); - strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path)); + snprintf(ds_path, sizeof(ds_path), "%s/%s/w1_slave", w1_path, chip); /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */ - if( (fd=open(w1_path, O_RDONLY)) < 0 ) - { - printf("open %s error: %s\n", w1_path, strerror(errno)); - return -4; - } - + if( (fd=open(ds_path, O_RDONLY)) < 0 ) + { + printf("open %s error: %s\n", ds_path, strerror(errno)); + return -4; + } + if(read(fd, buf, sizeof(buf)) < 0) { - printf("read %s error: %s\n", w1_path, strerror(errno)); - return -5; - } - + printf("read %s error: %s\n", ds_path, strerror(errno)); + rv = -5; + goto cleanup; + } + ptr = strstr(buf, "t="); if( !ptr ) { - printf("ERROR: Can not get temperature\n"); - return -6; + printf("ERROR: Can not get temperature\n"); + rv = -6; + goto cleanup; } ptr+=2; /* convert string value to float value */ *temp = atof(ptr)/1000; - - return 0; + +cleanup: + close(fd); + return rv; } -- Gitblit v1.9.1