使用C读取GPIO状态


8

我已经实现了此示例,以熟悉C中的基本GPIO编程。该代码演示了如何写入GPIO引脚,但未明确说明如何读取引脚的状态。我怀疑WiringPi最终将是一个更好的解决方案,因为我最终希望读取输出引脚的状态,但是与此同时,我想通过Dom和Gert的代码完成我的跋涉。那我怎么能读一个引脚的值呢?


关心解释下降投票吗?
bobthechemist

2
否决票很荒谬,也许您在某个时候使某人不高兴。向我+1只是为了补偿。
goldilocks

Answers:


6

来自elinux的该示例使用内存映射的IO。内核还通过1导出用户空间接口/sys/class/gpio,该接口也记录在elinux上。在C中工作,您显然会使用低级/ 而不是。不要使用更高级别的基于流的功能。read()write()echo

一些程序员被告知使用文件接口执行他们认为应该通过系统调用完成的操作时,会感到有些沮丧。 这纯粹是风格问题 -它们完全相同。没有“额外的I / O开销”等,在这种情况下访问文件是因为它不是真实文件,而是内核接口。 就像您曾经使用过的任何其他系统ABI一样,只是有所不同。长期以来,内核开发人员一直首选使用/procand /sys节点,但是我仍然看到人们决心在可能的地方使用系统调用-例如sysfs(),尽管事实man 2 sysfs清楚地表明:

此System-V派生的系统调用已作废;不要使用它。 在具有/ proc的系统上,可以通过/ proc / filesystems获得相同的信息。使用该接口。

这是一个C库手册页,告诉您使用/procinterface。如果那还不足以说服您,那无济于事。 /sys是同一种东西。重点是:仅仅因为您使用文件节点而不是某些C特定的API并不意味着您没有在进行真正的编程,否则性能将受到损害等。有人可能会说这实际上是一个不错的功能。这也是编写OS内核的人推荐的方法。

GPIO接口的快速介绍可以在下面找到[kernel-src]/Documentation/ABI/testing/sysfs-gpio

  GPIOs are only made available to userspace by an explicit
  "export" operation.  If a given GPIO is not claimed for use by
  kernel code, it may be exported by userspace (and unexported later).
  Kernel code may export it for complete or partial access.

  GPIOs are identified as they are inside the kernel, using integers in
  the range 0..INT_MAX.  See Documentation/gpio.txt for more information.

    /sys/class/gpio
        /export ... asks the kernel to export a GPIO to userspace
        /unexport ... to return a GPIO to the kernel
        /gpioN ... for each exported GPIO #N
            /value ... always readable, writes fail for input GPIOs
            /direction ... r/w as: in, out (default low); write: high, low
            /edge ... r/w as: none, falling, rising, both
        /gpiochipN ... for each gpiochip; #N is its first GPIO
            /base ... (r/o) same as N
            /label ... (r/o) descriptive, not necessarily unique
            /ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1)

除了elinux之外,似乎还有各种教程和类似的在线教程。我只是在使用I2C,否则我会给你一个更直接的答案。

如果您想编写访问GPIO的内核空间代码,可以在这里看看,尽管我认为这仅在您想为特定设备编写驱动程序并创建自己的用户空间API时才有用。


1.由于映射内存的IO还必须使用读/写,因此我不确定在此一种方法是否比另一种方法具有明显优势。/sys如果您正在寻找可以在树莓派以外的其他东西上运行的代码,则使用该接口无疑会更加便携。


谢谢。我的语言一直是Mathematica,所以当它移植到RPi时,我跳了起来。目前,通过本地Wolfram命令进行的GPIO访问有点缓慢,因此,我正在尝试学习足够的c知识,以免遇到麻烦。(所以没有内核空间代码为我编写!)
bobthechemist

read()/ write()和基于文件描述符(与文件流相对)的函数实际上不是Standard C,但它们是POSIX和linux上的standard。这里有一个介绍:gnu.org/software/libc/manual/html_node/… 标准文件流可能有效,但以我的经验,它们对于/sys和的WRT还是有问题的/proc。无论如何,使用较低级别的描述符不再困难或困难。祝好运!
goldilocks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.