From 93fb646dc67d6339e75a6787d629bbe3c45b9b37 Mon Sep 17 00:00:00 2001 From: Guo Wenxue <guowenxue@gmail.com> Date: Wed, 21 Sep 2022 23:03:14 +0800 Subject: [PATCH] update ds18b20 source code --- apue/1.File_IO/ds18b20.c | 67 +++++++++++++++++---------------- 1 files changed, 35 insertions(+), 32 deletions(-) diff --git a/apue/1.File_IO/ds18b20.c b/apue/1.File_IO/ds18b20.c index efb0025..1ad5192 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,21 +24,21 @@ 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 */ @@ -54,10 +54,11 @@ char *ptr; float value; int found = 0; + int rv = 0; if( !temp ) { - return -1; + return -1; } /*+-------------------------------------------------------------------+ @@ -76,15 +77,15 @@ /* 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 */ @@ -92,31 +93,33 @@ strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path)); /* 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(w1_path, O_RDONLY)) < 0 ) + { + printf("open %s error: %s\n", w1_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", w1_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; - - close(fd); - return 0; +cleanup: + close(fd); + return rv; } -- Gitblit v1.9.1