【问题标题】:Weird thing in file-descrpiter I/O for gpio portgpio 端口的文件描述符 I/O 中有奇怪的事情
【发布时间】:2013-04-10 20:56:39
【问题描述】:

我正在使用以下代码在 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;
}

【问题讨论】:

  • fd 打开到什么文件?
  • @duskwuff fd 被打开到一个 gpio 端口,路径为:/sys/calss/gpio/gpio102/value。

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


【解决方案1】:

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

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

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

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

lseek(fd, 0, SEEK_SET);

【讨论】:

  • 是的。它工作得很好。但是,我认为在进一步写入之前不需要 lseek,无论偏移量在哪里。根据我的新代码,写入将在阅读后立即生效。是因为文件被限制为一个字节,因此新的写入将替换旧的内容吗?还是因为该写入将从文件的开头开始?
  • 顺便说一句,那个“1”是什么。在输出的末尾,在长换行符之前?
  • 我的猜测和你的一样:write() 上的文件指针被忽略到这些文件,因为只有一个合理的地方可以写入。就1. 而言,这是数据的文本表示。 (显示的是.,而不是换行符。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2019-02-09
相关资源
最近更新 更多