Raspberry pi gpio: направление чтения файла не работает в c, кроме случаев, когда программа была запущена снова и gpio pin не экспортирован - PullRequest
0 голосов
/ 09 ноября 2019

Итак, я пытаюсь создать библиотеку для управления gpio (используя sysfs) в c, все остальное работало нормально, пока я не создал функцию « gpio_change_direction », которая должна записывать вНаправление файла желаемое направление (например, «вне»). Проблема в том, что это не работает, потому что функция " fopen " (входит в стандартную библиотеку) возвращает значение null, но она работает при втором запуске программы, если вы не экспортировалиGPIO pin, он не будет работать, но если вы не экспортировали его, он не будет работать. Кстати, я использую Raspberry pi 3 b, но эта программа должна работать одинаково на любом устройстве raspberry pi, потому что она использует sysfs, а не прямое управление регистрами. И, конечно же, я использую GNU / Linux для этого, точнее говоря, Rasbian.

Так вот код для функции gpio_change_direction :

uint8_t gpio_change_direction(uint8_t gpio, char *direction) {
    FILE *fdirection;

    char *direction_filename;

    direction_filename = (char *)malloc(sizeof(char) * (strlen(GPIODIR) + GPIO_FILENAME_CHAR_SIZE + strlen("/direction")));

    strcpy(direction_filename, GPIODIR);
    strcat(direction_filename, "gpio");
    strcat(direction_filename, int_to_string(gpio)); 
    strcat(direction_filename, "/direction");

    fdirection = fopen(direction_filename, "w");
    puts("Hello");
    printf("fdirection: %p %d %s\n", fdirection, fdirection, direction_filename);

    if(fdirection == NULL) {
        puts("Helerror timelo!");
        return(FILE_ERROR);
    }

    fputs(direction, fdirection);

    fclose(fdirection);
    return(0);
}

Константа FILE_ERRORопределяется в заголовочном файле gpio_sysfs.h , который я создал.

Основная функция (это еще не настоящая библиотека, поэтому у нее есть основной файл), которую я использовал для проверки функции gpio_change_direction :

int main(int argv, char *argc[]) {
    int i;
    char *d;

    d = (char *)malloc(sizeof(char) * 3);

    gpio_export(24);
    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_change_direction(24, GPIO_OUT);

    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_unexport(24); //Works if this is removed and then the program is ran again

    return(0);
}

Еслистрока с gpio_unexport удаляется, затем она работает во второй раз.

Я сотни раз менял код и пробовал много-много вещей, буду признателен за любую помощь, иЗаранее спасибо.

Вот ссылка для вставки файла libgpio_sysfs.c: https://pastebin.com/sHaav6gY А вот файл gpio_sysfs.h: https://pastebin.com/iwTr4Fjx

...