硬件环境: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}。
后面始终和第二次执行一眼改的结果。
求教这是什么情况呢,是不是我写法哪里不对
离线
用 cat 命令呢?
晕哥, shell里面采用cat命令一直是正确的
离线
读完 close,下次读再open应该正常吧?
这样操作是正常的,但是过不了多久,系统就会提示可用的文件描述符不足
离线
阿黄 说:哇酷小二 说:读完 close,下次读再open应该正常吧?
这样操作是正常的,但是过不了多久,系统就会提示可用的文件描述符不足
按道理不应该,close之后就把资源释放了。
我也是很奇怪,按理说即使不close,应该也没问题。close掉也应该释放掉资源。 但是我main里面只跑了上面的代码,确实还是一样的问题
离线
晕哥,是我犯低级错误了- - 第一次read之后,文件指针已经到了末尾,第二次肯定读不出来,第二次读要先把指针移动到文件头,在第二次read之前,调用lseek(fd_dev,0,SEEK_SET); 就可以了
离线
离线