您尚未登录。

楼主 # 2021-07-01 16:39:16

阿黄
会员
注册时间: 2018-10-03
已发帖子: 299
积分: 134

请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

硬件环境:MT7621,
软件环境 openwrt 19.07.3
内核:4.14

例如读取gpio14端口的输入点值。
1. 采用shell命令读取均正常。

cat /sys/class/gpio/gpio14/value

2. 在C程序里面,当采用read读取的时候,第一次读取是正确的,

// 朝向
#define	 OUT							"out"
#define	 IN							"in"

#define EXPORT_PATH						"/sys/class/gpio/export"

/**
* @brief 门禁检测引脚
*/

#define DEV_PATH_DOOR_DETE					"/sys/class/gpio/gpio14/value"
#define DIRECT_PATH_DOOR_DETE				"/sys/class/gpio/gpio14/direction"
#define GPIO_DOOR_DETE						"14"

static int init_detect_io(char *export_path, char *dev_path, char *direct_path, char *gpio);

static int fd_dev = -1;

void drv_door_detect_init(void)
{
	fd_dev = init_detect_io(EXPORT_PATH, DEV_PATH_DOOR_DETE, DIRECT_PATH_DOOR_DETE, GPIO_DOOR_DETE);
}

static int init_detect_io(char *export_path, char *dev_path, char *direct_path, char *gpio)
{
	// 打开GPIO设备导出设备
	int fd_export = open(export_path, O_WRONLY);
	if (fd_export < 0)
	{
		perror("open export");
		return 0;
	}
	// 向export文件写入GPIO排列序号字符串
	write(fd_export, gpio, strlen(gpio));
	close(fd_export);

	// 打开GPIO输入输出控制设备
	int fd_dir = open(direct_path, O_RDWR);
	if (fd_dir < 0)
	{
		perror("open direction");
		return 0;
	}

	// 设置输出方向
	write(fd_dir, IN, strlen(IN));
	close(fd_dir);

	// 打开GPIO输入输出控制设备
	int ret = -1;
	ret = open(dev_path, O_RDONLY);
	if (ret < 0)
	{
		perror("open dev");
		return 0;
	}

	return ret;
}
/**
* @brief 检测门磁信号
* @note
* @retval 1或者0. 门磁断路检测到0,门磁通路检测到1
*/

bool drv_door_detect(void)
{
	char level[2] = {0};
	bool door_state;
	int ret = -1;

	ret = read(fd_dev, level, sizeof(level));
	if(ret < 0)
	{
		perror("read error\n");
		return 0;
	}

	if (level[0] == '0')
	{
		door_state = false;
	}
	else
	{
		door_state = true;
	}


	return door_state;
}

在第一次执行 ret = read(fd_dev, level, sizeof(level));  level的值为"1",也就是{0x31 0x00}
第二次执行ret = read(fd_dev, level, sizeof(level)); 后, ret = 0,level = {0x00,0x00}。
后面始终和第二次执行一眼改的结果。
求教这是什么情况呢,是不是我写法哪里不对

离线

#1 2021-07-01 16:42:30

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

用 cat 命令呢?





离线

楼主 #2 2021-07-01 16:43:23

阿黄
会员
注册时间: 2018-10-03
已发帖子: 299
积分: 134

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

哇酷小二 说:

用 cat 命令呢?

晕哥, shell里面采用cat命令一直是正确的

离线

#3 2021-07-01 16:55:11

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

读完 close,下次读再open应该正常吧?





离线

楼主 #4 2021-07-01 16:55:58

阿黄
会员
注册时间: 2018-10-03
已发帖子: 299
积分: 134

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

哇酷小二 说:

读完 close,下次读再open应该正常吧?

这样操作是正常的,但是过不了多久,系统就会提示可用的文件描述符不足

离线

#5 2021-07-01 16:58:59

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

阿黄 说:
哇酷小二 说:

读完 close,下次读再open应该正常吧?

这样操作是正常的,但是过不了多久,系统就会提示可用的文件描述符不足

按道理不应该,close之后就把资源释放了。





离线

楼主 #6 2021-07-01 17:41:22

阿黄
会员
注册时间: 2018-10-03
已发帖子: 299
积分: 134

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

哇酷小二 说:
阿黄 说:
哇酷小二 说:

读完 close,下次读再open应该正常吧?

这样操作是正常的,但是过不了多久,系统就会提示可用的文件描述符不足

按道理不应该,close之后就把资源释放了。

我也是很奇怪,按理说即使不close,应该也没问题。close掉也应该释放掉资源。 但是我main里面只跑了上面的代码,确实还是一样的问题

离线

楼主 #7 2021-07-01 18:33:38

阿黄
会员
注册时间: 2018-10-03
已发帖子: 299
积分: 134

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

晕哥,是我犯低级错误了- - 第一次read之后,文件指针已经到了末尾,第二次肯定读不出来,第二次读要先把指针移动到文件头,在第二次read之前,调用lseek(fd_dev,0,SEEK_SET); 就可以了

离线

#8 2021-07-01 20:37:59

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 请教使用读写文件的方法read函数读取gpio值时,只能读取一次的问题。

阿黄 说:

晕哥,是我犯低级错误了- - 第一次read之后,文件指针已经到了末尾,第二次肯定读不出来,第二次读要先把指针移动到文件头,在第二次read之前,调用lseek(fd_dev,0,SEEK_SET); 就可以了

感谢楼主分享宝贵经验。





离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn