Linux下用c程序读取树莓派DS18B20探测的温度


在写编程之前我们,我们先要了解文件I/O操作函数!我将介绍一下我们经常用到的几个函数,

文件I/O操作函数

一、open系统调用

int open(const char*path,int oflag,../*mode_t mode*/); 

1、函数说明:open()系统调用用来打开一个文件,并返回一个文件描述符(file description), 并且该文件描述符是当前进程最小、未使用的
文件描述符数值。
2、参数说明:(1)path: 要打开的文件、设备的路径。
(2)oflag: 由多个选项进行“或”运算构造oflag参数 。
①必选:

O_RDONLY (只读)
O_WRONLY(只写)
O_RDWR(读写)

② 可选:

O_APPEND 每次写时都追加到文件的尾端;
O_CREAT 文件不存在则创建它,使用该选项需要第三个参数mode
mode: oflag带O_CREAT选项时可以用来创建文件,这时必须带该参数用来指定创建文件的权限模式,如066。 否则不需要;
O_TRUNC 如果文件存在,而且为只写或读写成功打开,则将其长度截取为0;
O_NONBLOCK 如果path是一个FIFO、块设备、字符特殊文件则此选项为文件的本次打开和后续的I/O操作设置非阻塞模式方式。
O_EXEC、O_SEARCH、O_CLOEXEC、O_NOCTTY…

二、 close()系统调用

int close(int fd);

说明:该函数用来关闭一个打开的文件描述符,关闭一个文件时还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核将会自动关闭它所有打开的文件。

三、write()系统调用

ssize_t write(int fd, const void *buf, size_t nbytes);

说明:write()函数用来往打开的文件描述符fd指向的文件中写入buf指向的数据,nbytes指定要写入的数据大小。如果返回值<0则说明写入出错,譬如尝试往一个只读的文件中写入则会抛错,错误的原因系统会保存到errno变量中去。如果>0则为实际写入的数据大小。

四、read()系统调用

ssize_t read(int fd, void *buf, size_t nbytes);

说明:ead()函数用来从打开的文件描述符对应的文件中读取数据放到buf指向的内存空间中去,最多不要超过nbytes个字节,这里
的nbytes一般是buf剩余的空间大小。如read成功,则返回实际读到的字节数(由nbytes或读到文件尾决定,其中EOF宏用来判断是否到了文件尾),如果返回值小于0则表示出错,如尝试读一个没有权限读的文件时就会抛错。

文件夹操作相关系统调用

我们在了解了文件的操作函数之后,文件夹的操作相对更加容易了

函数原型函数
int mkdir(const char *pathname, mode_t mode);创建文件夹
int rmdir(const char *pathname);删除文件夹
DIR *opendir(const char *pathname);打开文件夹
struct dirent * readdir(DIR *dp);读文件夹
int closedir(IDR *dp);关闭文件夹
int chdir(const char * pathname);改变工作目录

其中readdir()系统调用的struct dirent定义如下:

struct dirent 
{ 
long d_ino; /* inode number 索引节点号 */ 
 off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ 
 unsigned short d_reclen; /* length of this d_name 文件名长 */ 
 unsigned char d_type; /* the type of d_name 文件类型 */ 
 char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */ 
}

Linux下用c程序读取树莓派DS18B20探测的温度

   #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <fcntl.h>
   #include <dirent.h>
   #include <string.h>
   #include <time.h>
   #include <errno.h>
   
  int ds18b20_get_temperature(float *temp);
  
  int main(int argc, char *argv[])
  {
          float temp;
  
          if( ds18b20_get_temperature(&temp) <0 )
          {
                  printf("ERROR:ds18b20 get temperature failure\n");
                  return 1;
          }
  
          printf("ds18b20 get temperature: %f \n",temp);
          return 0;
  }
  
  
   int ds18b20_get_temperature(float *temp)
  {
          char    w1_path[50] = "/sys/bus/w1/devices/";
          char    chip[20];
          char    buf[128];
          DIR     *dirp;
          struct  dirent  *direntp;
           int     fd = -1;
          char    *ptr;
          float   value;
          int     found = 0;
  
          if( !temp)
          {
                  return -1;
          }
  
          if( (dirp = opendir(w1_path)) == NULL)
          {
                  printf("opendir error:%s\n",strerror(errno));
                  return -2;
          }
  
          while((direntp = readdir(dirp)) !=NULL)
          {
                  if(strstr(direntp->d_name,"28-"))
                  {
                          strcpy(chip,direntp->d_name);
                          found = 1;
                          break;
                  }
          }
          closedir(dirp);
  
          if( !found )
          {
                  printf("can not find ds18b20 in %s\n",w1_path);
                  return -3;
          }
          strncat(w1_path,chip,sizeof(w1_path)-strlen(w1_path));
          strncat(w1_path,"/w1_slave",sizeof(w1_path)-strlen(w1_path));
          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;
          }
          ptr = strstr(buf, "t=");
          if( !ptr )
          {
                  printf("ERROR: Can not get temperature\n");
                  return -6;
          }
          ptr+=2;
          *temp = atof(ptr)/1000.0;
          close(fd);
          return 0;
  }

代码结果展示:
在这里插入图片描述
代码要结合上面的知识点来看会更加容易理解,如果有不懂得地方,或者有错误的地方,还请多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值