使用DS18B20温度传感器进行分段故障

时间:2018-03-05 00:58:12

标签: c++ raspberry-pi

我正在尝试使用 DS18B20 在C ++中运行使用 raspberry pi3 读取的代码。编译时没有错误,但是当我尝试运行它时。它给出了分段错误的错误。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <iostream>

#define  BUFSIZE  128
using namespace std;
int main(void)
{
float temp;
    int i, j;
        size_t ret;
    FILE *fd;
    char buf[BUFSIZE];
    char tempBuf[5];
    char *buffer;
    buffer = (char*) malloc (sizeof(char)*BUFSIZE);
    while(1){   
        fd = fopen("/sys/bus/w1/devices/28-0000085c3551/w1_slave", O_RDONLY);
        if(fd != NULL){
            perror("open device file error");
            break;
        }
        while(1){
            ret = fread(buffer, sizeof(char), BUFSIZE, fd);
            if(0 == ret){
                break;  
            }
            if(-1 == ret){
                if(errno == EINTR){
                    continue;   
                }
                std::cout<<"Read Error";                
                fclose(fd);
                break;
            }
        }

        for(i=0;i<sizeof(buf);i++){
            if(buf[i] == 't'){
                for(j=0;j<sizeof(tempBuf);j++){
                    tempBuf[j] = buf[i+2+j];    
                }
            }   
        }

        temp = (float)atoi(tempBuf) / 1000;


        std::cout<< "%.3f C\n" << temp;
        fclose(fd);

        //delay(500);
        }
}
`

编译时没有错误发生。 它(stackoverflow网站)一直在要求添加更多细节我没有更多细节添加这是我面临的唯一问题,上面的代码正在编译但没有运行。希望你们中的一些人可以帮助

1 个答案:

答案 0 :(得分:0)

  • fopen()调用的第二个参数必须为字符串,以您的情况为"r"才能以只读模式打开文件
  • fopen()如果无法打开文件,则返回NULL,否则返回非NULL指针;您的检查(fd != NULL)是否应该检查(fd == NULL)的代码
  • 正如您对问题的评论所指出的那样,表达式buf[i+2+j]可以访问buf数组之外的位置
  • tempBuf不保证其中包含字符串终止符,因此,当您调用atoi(tempBuf)时,此函数可以访问tempBuf数组末尾的内容