通过树莓派获取温度(基于文件I/O的简单应用)
树莓派DS18B20获取温度
1 项目背景介绍
1.1项目想法
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点,刚好拿实验室的树莓派来做一下获取温度的小项目。
当树莓派配置好DS18B20数字温度传感器后,该温度信息通常保存在下面路径中,我们只需要读取文件中的温度即可:
/sys/bus/w1/devices/28-XXXXXXXX/w1_slave
查看路径文件下温度数据:
1.2流程描述
1 调用opendir()和readdir()来打开读取文件路径(默认文件路径“/sys/bus/w1/devices/”)
在这里我们注意到为什么不是全部路径 (/sys/bus/w1/devices/28-XXXXXXXX/w1_slave) 而是只截取到 (/sys/bus/w1/devices/),这是因为“28-XXXXX”是产品***,如果我们换了一个DS18B20进行获取温度,产品***XXXXX改变,那此路径就不能用了,而这一产品***XXXXX目录无论变成什么永远在(/sys/bus/w1/devices/)路径下,所以我们只打开读取路径到这里
2 寻找“28-”开头的文件,将其存入缓冲区
接下来在(默认文件路径“/sys/bus/w1/devices/”)下通过strstr()函数找到“28-”打头的文件,并且存入缓冲区,方便更改
3 调用closedir()关闭文件**
4 通过strncat链接文件路径
调用strncat将(默认文件路径“/sys/bus/w1/devices/”)和存入缓冲区的(“28-XXXXX”)连接起来,然后再调用strncat()将“/w1_slave”路径连接起来,此时需要读取数据的路径就完整了,进行实时获取产品***的文件目录,以便实时读取温度
5 调用open()l和read()来打开文件,读取文件,找到温度(t=)打头的数据
利用strstr()再匹配(“t=”)打头的数据
6 调用close()关闭文件
7 将数据进行处理然后打印即可
将获得的字符类型数据转换成单精度类型数据,只打印数据,不打印“t=”
2 项目代码介绍
2.1文件I/O的API函数
open()
int open(const char *path, int oflag, ... /*mode_t mode*/);
open()系统调用用来打开一个文件,并且返回一个文件描述符(fd),并且该文件描述符是当前进程最小,并未使用的文件描述符数值,即3,因为0是标准输入,1是标准输出,2是标准出错。
参数: path: 要打开的文件、设备的路径
oflag: 由多个选项进行“或”运算构造oflag参数 。
必选: O_RDONLY (只读)、 O_WRONLY(只写)、 O_RDWR(读写)
可选: O_APPEND 每次写时都追加到文件的尾端。
O_CREAT 文件不存在则创建它,使用该选项需要第三个参数mode
O_TRUNC 如果文件存在,而且为只写或读写成功打开,则将其长度截取为0;
O_NONBLOCK 如果path是一个FIFO、块设备、字符特殊文件则此选项为文件的本次打开和后续的I/O操作
设置非阻塞模式方式。
O_EXEC、O_SEARCH、O_CLOEXEC、O_NOCTTY…
mode: oflag带O_CREAT选项时可以用来创建文件,这时必须带该参数用来指定创建文件的权限模式,如066。 否则不
需要。使用示例代码:
int fd;
fd = open(“text.txt”, O_RDWR|O_CREAT|O_TRUNC, 0666);
fd = open(“text.txt”, O_WRONLY|O_APPEND);
read()
ssize_t read(int fd, void*buf, size_t nbytes);
read()函数是用来打开文件描述符对应的文件中读取数据放到buf指向的内存空间中去,最多不要超过nbytes个字节,这里的nbytes一般指的是buf剩余空间的大小。如果read成功,则返回实际读到的字节数(由nbtyes或读懂到文件尾决定,其中EOF宏用来判断是否到了文件尾),如果返回值小于0则表示出错,如哦尝试读取一个没有权限读取的文件时就会抛错。
close()
int close(int fd);
该函数用来关闭一个打开的文件描述符,关闭一个文件时还会释放该进程加载该文件上的所有记录锁。当一个进程终止时,内核将会自动关闭它所打开的文件。
opendir()
DIR *opendir(const char *pathname)
readdir()
closedir()
2.2项目代码
上一篇: DRF Serializer序列化器使用