gpt4 book ai didi

c - 在 C 中通过引用返回和传递文件描述符

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:39 25 4
gpt4 key购买 nike

我正在用 C 从头开始​​在 Raspberry Pi 上构建一个气象站。我有一个包含获取温度代码的文件,还有另一个文件可以调用这些函数。我以前写过代码来执行此操作,但代码质量很差,我正在尝试重新编写更好的代码。

我认为我遇到的问题是理解如何传递对指向传感器的文件描述符的引用。

请考虑我的软件中的这段代码片段。 (我确定此部分存在错误)。

#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 的一小段代码,它应该是一个指针。但是,当我这样做时,我的代码段会出错。

最佳答案

您应该在该行收到编译器警告

    fd = initGPIO(0, 0x76);

因为fd类型为 intinitGPIO返回和int* .

更改 initGPIO如下

int initGPIO(int i2cBus, int i2cAddr){
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");
}
return fd;
}

解释:

文件描述符是一个标识打开文件的数字。作为initGPIO将返回文件描述符,您可以在 main 中分配它你可以简单地返回号码。您不需要指针。

如果你想传递 fd,你需要传递一个指针来自 main到预期修改 fd 值的函数.

您在 initGPIO 中还有两个错误:

    int *addr = malloc(sizeof(int)); /* Now addr points to the allocated memory for an int. */
int fd;
/* ... */
addr = &fd; /* Now you overwrite addr with the address of the local variable fd.
This creates a memory leak. Using the address in main() would be
undefined behavior because the address of the local variable fd will
become invalid when the function returns.
To put the fd value into the allocated memory you would have to use
*addr = fd, but this is not necessary here as explained above. */

关于c - 在 C 中通过引用返回和传递文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58691812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com