我正在尝试使用 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网站)一直在要求添加更多细节我没有更多细节添加这是我面临的唯一问题,上面的代码正在编译但没有运行。希望你们中的一些人可以帮助
答案 0 :(得分:0)
fopen()
调用的第二个参数必须为字符串,以您的情况为"r"
才能以只读模式打开文件fopen()
如果无法打开文件,则返回NULL,否则返回非NULL指针;您的检查(fd != NULL)
是否应该检查(fd == NULL)
的代码buf[i+2+j]
可以访问buf
数组之外的位置tempBuf
不保证其中包含字符串终止符,因此,当您调用atoi(tempBuf)
时,此函数可以访问tempBuf
数组末尾的内容