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

时间:2015-01-23 10:52:05

标签: c linux driver

我有usb char设备,我设法用usb skeleton 2.2驱动程序绑定到/ dev / device0(只有很少的注释才能理解它)。 现在我必须编写用户应用程序,它将发送和接收命令ascii chars。 我可以毫无问题地发送带有写入的命令,但我不知道如何从设备中正确读取。 由于我不知道消息将持续多长时间,我尝试了类似这样的事情

#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()函数返回-512,同时不调用倒数第二个读取的回调函数。 为什么会发生这种情况?如何确定设备是否发送了任何数据?

1 个答案:

答案 0 :(得分:0)

char *ret;

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

<强>编辑:

否则

如果您只想逐个字符地填写

char ret;

<强>读():

  

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

所以进行以下更改:

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