0

我正在寻找一种方法来读取由内核创建的处于不断变化状态的文件。在 beaglebone 上,获取模拟输入的值是从文件中读取的问题,我们称之为ain_value. 获取此值的推荐方法是使用cat命令。但是,我希望能够使用 C 从文件中读取。我目前的处理方式似乎有一些缺陷。如果我尝试在不到一秒的循环中读取文件,则会出现一些同步问题。使用 `watch --interval=0.5 'cat ain_value' 我可以获得一致的值,当使用以下代码时,我得到文件无法打开。有没有办法与操作系统同步并使以下代码更可靠?

int AIN_value(char AIN) {
    char line[10] = {0};
    char BUFFER[35];

    snprintf(BUFFER, sizeof(BUFFER), "%s%c", AIN_FILE, AIN);
    FILE *fp;
    fp  = fopen(BUFFER, "r");
        if(fp == NULL) {
                printf("ERROR: could not open %s\n", BUFFER);
        }

    printf("\n"); // Temporary fix until we know how to sync file reads.
    if (fgets(line, sizeof(line), fp) == NULL) {
        printf("ERORR: could not read from %s\n", BUFFER);
    }

    line[strlen(line) - 1] = '\0';
    fclose(fp);
    return(atoi(line));
}

附带说明的是,当使用该printf("\n"); // Temporary fix until we know how to sync file reads.行时,我可以获得准确的文件读取,但是如果我删除该行,我会得到错误的值。

4

1 回答 1

0

如果读取/sys/devices/ocp.2/helper.14/AIN伪文件产生错误数据,则生成该数据的内核代码有问题。除了更正此代码之外,您可能会查看是否有更好的 API 用于读取模拟输入等可用。

于 2014-10-08T13:24:07.950 回答