gpio端口的file-descrpiter I / O中的奇怪之处

时间:2013-04-10 20:56:39

标签: c file-io embedded-linux file-descriptor

我在Linux中编码以使用以下代码控制我板上的gpio端口。但是,read()的结果始终为0x10,这是LF换行的十六进制。 电压是一个枚举变量,其int值为0,1代表低电平和高电平。 fd是gpio端口的文件描述符。 0x30是char'0'的十六进制代码。 write()中没有错误。

int set_gpio( int fd,enum voltage_e voltage)
{
    const unsigned char w_buff =0x30+voltage;
    unsigned char r_buff='2';

    if (0 >= write(fd, &w_buff, 1))
    {
        LOGD(" Error1 in setting gpio to  %d", voltage);
        return -1;
    }
    __usr_sleep(0, 10000000);

    if (read(fd, &r_buff, 1))
    {
        if (r_buff != 0x30+voltage)
        {
            LOGD(" r_buff is %d", r_buff);
            return -1;
        }
    }
    else
    {
        LOGD(" Error3 in setting gpio to %d", voltage);
        return -1;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

为了与shell实用程序兼容,GPIO端口的内容通常是单个字符,后跟换行符 - 例如:

% xxd /sys/class/gpio/gpio89/value
0000000: 310a                                     1.

将单个字符写入GPIO设备是将文件指针前进到第二个字符,这个字符始终是您所看到的换行符。

在执行读/写操作之前,您需要将文件指针重置为开头:

lseek(fd, 0, SEEK_SET);