gpt4 book ai didi

c++ - 使用 fgetc 为 gpio 读取 linux sysfs

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:38 25 4
gpt4 key购买 nike

我写了一个简单的程序来使用 linux sysfs 读取 gpio 而没有轮询,但似乎当我想读取少于三个字符时 fgetc 和 fgets 不能正常工作我想知道这是否只是一个错误或者我是否犯了错误在我的代码中。

FILE* fd = fopen("/sys/class/gpio/gpio12/value", "rw+");
if(!fd) {
cerr << "could not open the file." << endl;
}
setbuf(fd, NULL);

while(true) {
if(fseek(fd, 0L, SEEK_SET)) {
cerr << "could not reposition the indicator" << endl;
}

char val = fgetc(fd);
cout << val << '\r';

cout.flush();
};

即使我对 gpio#12 施加高电平电压,上面的代码也总是返回“0”,但是当我替换 fgetc 并且它遵循这些时

    char str[3] = {0};
fgets(str, 3, fd);
cout << str[0] << 'r';

程序运行正常。另一方面,值文件只包含一个字符“1”或“0”,人们可能会想到使用带有 2 个或 1 个字符的 fgets。在那种情况下它也不起作用。可以请一位专业人士解释一下那里发生了什么。上面的代码有什么问题。我使用g++编译代码,我的gcc版本是4.6.3-14 armhf

最佳答案

您可以使用/bin/cat 来显示/sys/class/gpio/gpioXX/value 文件的内容。文件的内容将是 ASCII 字符“0”或 ASCII 字符“1”后跟换行符“\n”。

我认为您可以简单地获取文件中的第 0 个字节,看看它是 ASCII“0”(0x30) 字符还是 ASCII“1”字符 (0x31)。在这种情况下,缓冲 I/O 没有意义。

int fd;
char val;
int ret;

if ((ret = open("/sys/class/gpio/gpio12/value", O_RDONLY)) < 0) {
// Fail.
return;
}

fd = ret;

for (;;) {
if ((ret = lseek(fd, 0, SEEK_SET)) < 0) {
// Fail.
break;
}
if ((ret = read(fd, &val, 1)) < 0) {
// Fail.
break;
}

if ((val != 0x30) && (val != 0x31)) {
// Whiskey tango foxtrot.
}

val = val - 0x30;

fprintf(stdout, "val=%d\n", val);
fflush(stdout);
};

关于c++ - 使用 fgetc 为 gpio 读取 linux sysfs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com