2015-01-23 5 views
1

У меня есть устройство usb char, которое мне удалось связать с/dev/device0 с помощью usb skeleton 2.2 driver (только с несколькими комментариями, чтобы понять его). Теперь я должен написать приложение пользователя, которое будет отправлять и получать команды в виде символов ascii. Я могу отправлять команды с записью без проблем, но я не знаю, как правильно читать с устройства. Как я не знаю, как долго сообщение будет, я пытался что-то вроде этогоПочему чтение с устройства USB-устройства замораживается?

#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, а функция обратного вызова предпоследнего чтения не вызывается. Почему это происходит и как мне узнать, есть ли какие-либо данные, отправленные устройством?

+0

[вздох] После успешного завершения чтения() и pread() возвращает неотрицательное целое число, указывающее количество байтов, считанных. В противном случае функции должны возвращать -1 и устанавливать errno для указания ошибки ' –

ответ

0
char *ret; 

память не выделяется указатель ret и вы пишете в это место, которое является UB.Hence вы можете увидеть аварию. Выделите память на свой указатель.

редактирует:

Else

Если вы просто хотите, чтобы достичь посимвольно иметь

char ret; 

чтения():

чтения возвращает номер символов, которые он читает , Когда он достигнет конца файла, он больше не сможет читать (вообще), и он будет return 0, а не EOF.

Так сделайте следующие изменения:

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

Или, поскольку чтение является одним символом за раз (если я помню порядок параметров для 'read()' правильно), просто измените его на 'char ret; '... –

+0

извините, я забыл об этом, но это не имеет значения, приложение не разбивается, оно зависает – Kostrahb

+0

@ MichaelKjörling Полностью имеет смысл, поэтому добавил его к моему ответу – Gopi