树莓派单总线自动读取18b20温度传感器的C语言例程

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <dirent.h>
  6. #include <string.h>
  7. #include <time.h>

  8. int main(int argc, char *argv[])
  9. {
  10.     char path[50] = "/sys/bus/w1/devices/";
  11.     char rom[20];
  12.     char buf[100];
  13.     DIR *dirp;
  14.     struct dirent *direntp;
  15.     int fd =-1;
  16.     char *temp;
  17.     float value;

  18.     system("sudo modprobe w1-gpio");
  19.     system("sudo modprobe w1-therm");
  20.     if((dirp = opendir(path)) == NULL)
  21.     {
  22.         printf("opendir error\n");
  23.         return 1;
  24.     }

  25.     while((direntp = readdir(dirp)) != NULL)
  26.     {
  27.         if(strstr(direntp->d_name,"28-00000"))
  28.         {
  29.             strcpy(rom,direntp->d_name);
  30.             printf(" rom: %s\n",rom);
  31.         }
  32.     }
  33.     closedir(dirp);

  34.     strcat(path,rom);
  35.     strcat(path,"/w1_slave");
  36.     while(1)
  37.     {
  38.         if((fd = open(path,O_RDONLY)) < 0)
  39.         {
  40.             printf("open error\n");
  41.             return 1;
  42.         }

  43.         if(read(fd,buf,sizeof(buf)) < 0)
  44.         {
  45.             printf("read error\n");
  46.             return 1;
  47.         }

  48.         temp = strchr(buf,'t');
  49.         sscanf(temp,"t=%s",temp);
  50.         value = atof(temp)/1000;
  51.         printf(" temp : %3.3f °C\n",value);

  52.         sleep(1);
  53.     }
  54.     return 0;


  1. }

注:(1)system("sudo modprobe w1-gpio");system("sudo modprobe w1-therm");在程序的开头运行了一下modprobe命令
       (2) dirp = opendir(path) 打开/sys/bus/w1/devices/文件路径
(3)direntp = readdir(dirp) 读取当前路径下的文件或文件夹
(4)strstr(direntp->d_name,"28-00000")
查找28-00000开头的文件,strstr为字符串操作函数,上面这条语句表示文件名字是否包含字符串“28-00000”,如果匹配则返回第一次匹配的地址,没有搜索到则返回NULL.
(5)strcpy(rom,direntp->d_name); strcpy为字符串复制函数。,将包含28-00000的文件名复制到rom字符串
(6)strcat(path,rom);strcat(path,"/w1_slave");  strcat为字符串连接函数,此时path的值为/sys/bus/w1/devices/28-00000xxxx/w1_slave
(7)fd = open(path,O_RDONLY); read(fd,buf,sizeof(buf)) 打开文件并读取数据
(8)temp = strchr(buf,'t'); 查找字符‘t’第一次出现的位置,
(9)sscanf(temp,"t=%s",temp); sscanf函数是从一个字符串中读进与指定格式相符的数据,此处为从第二行数据中扫描出温度值



sitemap