C语言 为什么从 USB 字符设备冻结读取



我有 USB 字符设备,我设法使用 USB 骨架 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: %dn", fd);
    if (fd == -1) {
        printf("fopen() failed");
        exit(1);
    }
    command = "command1";
    write(fd, command, strlen(command));
    while (read(fd, ret,1)!=EOF)
    {
        fprintf(stderr,"%cn",ret);
    }
    close(fd);
    return 0;
}

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

char *ret;

内存未分配给指针ret,并且您正在写入该位置(即 UB)。因此,您可能会看到崩溃。为指针分配内存。

编辑:

如果您只想逐个角色地访问,请

char ret;

读取():

读取

返回它读取的字符数。当它到达终点时 的文件,它将无法再读取(根本),并且会 返回 0,而不是 EOF。

因此,请进行以下更改:

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

最新更新