Я строю метеостанцию на Raspberry Pi с нуля в C. У меня есть файл с кодом для получения температуры, и у меня также есть другой файл для вызова этих функций. Я уже писал код, чтобы сделать это, но качество кода было очень плохим, и я пытаюсь переписать его лучше.
Я считаю, что моя проблема заключается в понимании того, как передать ссылку надескриптор файла, указывающий на датчик.
Пожалуйста, рассмотрите этот фрагмент кода из моего программного обеспечения. (Я уверен, что ошибка существует в этом разделе).
#include "readTemp.h"
#include <stdio.h>
int main() {
int fd;
fd = initGPIO(0, 0x76);
getTemp(fd);
return(0);
}
и файл readTemp.C
int * initGPIO(int i2cBus, int i2cAddr){
int *addr = malloc(sizeof(int));
int fd;
//Initialise GPIO
if(gpioInitialise() < 0) {
perror("Initialisation failed\n");
exit(EXIT_FAILURE);
}
//Open the I2C bus
fd = i2cOpen(i2cBus, i2cAddr, 0);
if(fd < 0) {
perror("Device failed to open\n");
exit(EXIT_FAILURE);
}
//Send Reset
if(i2cWriteByte(fd, CMD_RESET) != 0){
perror("Error sending reset---\n");
}
addr = &fd;
printf("3-%d\n", &addr);
return(addr);
}
/*
* Reads the calibration data from the PROMs on the sensor
* Parameters - fd - File Descriptor of the i2c device
* *proms - Pointer to an array of 8 unsigned 16-bit integers
*/
static int getCalibData(int *fd, u_int16_t *proms) {
const int bytesToRead = 2;
char buf[2] = {0};
printf("2-%d\n", &fd);
// Populate for each prom (7)
for(int i = PROM_START; i < PROM_STOP; i = i + 2){
// Write PROM read commands
if(i2cWriteByte(*fd, i) != 0) {
perror("Error writing PROM command!!\n");
exit(EXIT_FAILURE);
}
// Read result from PROM
if(i2cReadDevice(*fd, buf, bytesToRead) <= 0) {
perror("Error reading from PROM\n");
exit(EXIT_FAILURE);
}
// Store result in array
proms[(i - PROM_START) / 2] = (buf[0] << 8) | (buf[1]);
}
return(0);
}
int getTemp(int *fd){
u_int16_t proms[8];
u_int32_t rawTemp = getRawTemp(fd);
printf("%d\n", rawTemp);
getCalibData(fd, proms);
for(int i = 0; i < 8; i++){
printf("%d-%d\n", i, proms[i]);
}
int temp = calcTemp(rawTemp, proms);
printf("---%d\n", temp);
return 0;
}
Код компилируется, но при запуске я получаю ошибку "Error writing PROM Command"
.
Я думаю, что моя ошибка может заключаться в небольшой части кода, где я присваиваю результат initGPIO()
для int
, где он должен быть указателем. Но, когда я делаю это, мой код вызывает ошибки.