首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么从usb设备读取冻结?

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

Stack Overflow用户
提问于 2015-01-23 10:52:05
回答 1查看 298关注 0票数 1

我有usb设备,我成功地用usb框架2.2驱动程序绑定到/dev/ device 0(只有很少的注释可以理解它)。现在我必须编写用户应用程序,它将以ascii chars的形式发送和接收命令。我能够在没有问题的情况下发送写命令,但我不知道如何正确地从设备中读取。因为我不知道这条消息会持续多久,所以我尝试了这样的方法

代码语言:javascript
复制
#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,然后程序等待(可能等待来自设备的数据,但我不确定这一点),在最后一次读取驱动程序的read()函数的wait_event_interruptible()返回-512,同时没有调用倒数第二读的回调函数。为什么会发生这种情况,以及如何确定设备是否发送了任何数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 10:54:47

代码语言:javascript
复制
char *ret;

内存没有分配给指针ret,而且您正在写入该位置,即UB.Hence,您可能会看到崩溃。将内存分配给指针。

编辑:

否则

如果你只想一字一句地达到

代码语言:javascript
复制
char ret;

读():

read返回它读取的字符数。当它到达文件的末尾时,它将无法再读取(完全),它将返回0,而不是EOF。

因此,进行以下更改:

代码语言:javascript
复制
while (read(fd, ret,1)!= 0)
{
    fprintf(stderr,"%c\n",ret);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28108260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档