为什么从 usb char 设备读取冻结?

Why read from usb char device freezes?

我有一个 usb char 设备,我设法用 usb skeleton 2.2 驱动程序绑定到 /dev/device0(只有很少的评论才能理解它)。 现在我必须编写用户应用程序,它将以 ascii 字符的形式发送和接收命令。 我可以毫无问题地发送带有写入的命令,但我不知道如何从设备中正确读取。 因为我不知道消息会持续多久,所以我尝试了这样的方法

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
    char *c, *ret;
    int fd,err;

    ret = malloc(1);
    char *dev = "/dev/device0";
    fd = open(dev, O_RDWR);
    printf("fd: %d\n", fd);
    if (fd == -1) {
        printf("fopen() failed");
        exit(1);
    }
    command = "command1";
    write(fd, command, strlen(command));
    while (read(fd, ret,1)!=EOF)
    {
        fprintf(stderr,"%c\n",ret);
    }
    close(fd);
    return 0;
}

但它不起作用,它似乎以某种方式陷入僵局或进入与此非常相似的状态。我能够发现,读取次数是随机的,通常是 3-6,然后程序等待(可能等待来自设备的数据,但我不确定),在上次读取函数期间 wait_event_interruptible () 在驱动的read()函数中 returns -512 同时没有调用倒数第二个read的回调函数。 为什么会出现这种情况,如何查看设备是否发送了任何数据?

char *ret;

内存未分配给您的指针 ret,您正在写入 UB.Hence 的位置,您可能会看到崩溃。为您的指针分配内存。

编辑:

其他

如果你只是想逐个字符地到达有

char ret;

读取():

read returns the number of characters it read. When it reaches the end of the file, it won't be able to read any more (at all) and it'll return 0, not EOF.

因此进行以下更改:

while (read(fd, ret,1)!= 0)
{
    fprintf(stderr,"%c\n",ret);
}