0

我正在使用以下代码在 Linux 中进行编码以控制板上的 gpio 端口。但是,read() 的结果始终是 0x10,它是用于 LF 换行的十六进制。电压是一个枚举变量,int 值为 0,1 代表低和高。fd 是 gpio 端口的文件描述符。0x30 是字符“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;
}
4

1 回答 1

1

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

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

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

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

lseek(fd, 0, SEEK_SET);
于 2013-04-10T23:32:32.250 回答