Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 9610|回复: 0

linux通用GPIO驱动,写GPIO文件不立即生效问题解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-16 03:37:11 | 显示全部楼层 |阅读模式

    Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值。其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexport两个属性文件,其余都是连接文件,如gpiochipN等。

    export文件导出某个GPIO,unexport将导出的GPIO从/sysfs中删除。向export文件写入要操作的GPIO序号N可以导出对应的GPIO设备目录,例如:

    #echo 68>/sys/class/gpio/export

    通过以上操作,在/sys/class/gpio/目录下生成gpio68/目录。通过读写该目录下的属性文件就可以操作该GPIO引脚。该目录具有一下属性文件:

    1、active_low:具有读写属性,决定value中的值是否翻转,0不翻转,1翻转。

    2、edge:具有读写属性,设置GPIO中断或检测中断是否发生。

    3、subsystem:符号链接,指向父目录。

    4、value:具有读写属性,GPIO引脚电平属性读取或者设置

    5、direction:具有读写属性,用于设置或查看GPIO引脚输入输出方向

    6、power:设备与供电方面相关的信息

    7、uevent:内核与(udev,自动设备发现程序)之间的通信接口。

    输入输出设置:

    #echo out>/sys/class/gpio/gpioN/direction   #设置输出

    #echo in>/sys/class/gpio/gpioN/direction   #设置输入

    输入读取:

    #echo in>/sys/class/gpio/gpioN/direction #设置输入

    #cat /sys/class/gpio/gpioN/value  #查看电平

    输出控制:

    #echo out>/sys/class/gpio/gpioN/direction

    #echo 0>/sys/class/gpio/gpioN/value  #输出低电平

    #echo 1>/sys/class/gpio/gpioN/value #输出高电平

    在C中操作GPIO

    int fd_export=open("/sys/class/gpio/export",0_RDWR);//打开GPIO导出设备

    write(fd_export,"N",,strlen("N"));

    close(fd_export);

    int fd_direcction = open("/sys/class/gpio/gpioN/direction",o_RDWR);

    write(fd_direction,"out",strlen("out"));//设置为输出

    close(fd_direction);

    int fd_value=open("/sys/'class/gpio/gpioN/value",O_RDWR);

    write(fd_value,"1",strlen("1"));

    close(fd_value);

     

    2018年3月14日:

         最近在用文件读写的方式操着GPIO引脚的应用中发现写操作不能及时生效,linux系统再读写文件时默认是再内存中先缓存的,设备文件也比例外,所以偶尔一块应用中会出现操作写设备文件不生效。如果要及时生效可以采用一下几个方法之一:

       1、条用系统命令:system("sync");

     2、再打开文件时添加:QIODevice::Unbuffered标志,如  open(QIODevice::ReadWrite | QIODevice::Unbuffered);

       3、写动作完成之后立即读取。

       个人建议采用第2种,第一种资源开销太大;第三种太耗费时间。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-5 15:48 , Processed in 0.061792 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表