2015-10-14 3 views
1

Я использую конвертер USB для Uart для передачи и приема данных. Вот мой код для передачиОшибка errno 11 Ресурс временно недоступен

void main() 
{ 
int USB = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NDELAY);   
struct termios tty; 
struct termios tty_old; 
memset (&tty, 0, sizeof tty); 

/* Set Baud Rate */ 
cfsetospeed (&tty, (speed_t)B9600); 
cfsetispeed (&tty, (speed_t)B9600); 

/* Setting other Port Stuff */ 
tty.c_cflag  &= ~PARENB;   // Make 8n1 
tty.c_cflag  &= ~CSTOPB; 
tty.c_cflag  &= ~CSIZE; 
tty.c_cflag  |= CS8; 

tty.c_cflag  &= ~CRTSCTS;   // no flow control 
tty.c_cc[VMIN] = 1;     // read doesn't block 
tty.c_cc[VTIME] = 5;     // 0.5 seconds read timeout 
tty.c_cflag  |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines 

/* Make raw */ 
cfmakeraw(&tty); 

/* Flush Port, then applies attributes */ 
tcflush(USB, TCIFLUSH); 

/* WRITE */ 
unsigned char cmd[] = "YES this program is writing \r"; 
int n_written = 0,spot = 0; 
do { 
n_written = write(USB, &cmd[spot], 1); 
spot += n_written; 
} while (cmd[spot-1] != '\r' && n_written > 0); 

Выход мой код такой же, как expacted

YES this program is writing 

Теперь это мой код для чтения из УАПП

/* READ */ 
int n = 0,spot1 =0; 
char buf = '\0'; 

/* Whole response*/ 
char response[1024]; 
memset(response, '\0', sizeof response); 

do { 
n = read(USB, &buf, 1); 
sprintf(&response[spot1], "%c", buf); 
spot1 += n; 
} while(buf != '\r' && n > 0); 

if (n < 0) { 
printf("Error reading %d %s",errno, strerror(errno)); 
} 
else if (n==0) { 
printf("read nothing"); 
} 
else { 
printf("Response %s",response); 
} 
} 

Это чтение из UART дает ошибку от errno, и это номер ошибки 11, в котором говорится, что ресурс временно недоступен

Я получаю этот выход

Error reading 11 Resource temporarily unavailable 

Я использую USB в UART преобразователь. Надеюсь, кто-то может помочь. Спасибо :)

ответ

0

Вы получаете код ошибки EAGAIN от вашего звонка read, и это заставляет вас выйти из цикла и распечатать ошибку. Конечно, EAGAIN означает, что это временная проблема (например, в то время, когда вы пытались ее прочитать, читать было нечего, возможно, вам нужно попробовать позже?).

Вы могли бы реструктурировать чтения, чтобы быть похожими на:

n = read(USB, &buf, 1) 
if (n == 0) { 
    break; 
} else if (n > 0) { 
    response[spot1++] = buf; 
} else if (n == EAGAIN || n == EWOULDBLOCK) 
    continue; 
} else { /*unrecoverable error */ 
    perror("Error reading"); 
    break; 
} 

Вы могли бы улучшить свой код, сделав buf быть массивом и чтение более одного символа в то время. Также обратите внимание, что sprintf не нужно, вы можете просто скопировать символ (ы) в массив.

+0

AKA 'Я установил его неблокирующимся и был удивлен, когда он не заблокировал' :) –

+0

Он показывает ошибку: оператор продолжения не в цикле –

+0

Умм ...... что вы делали с временем цикл? Удалили ли вы петлю? –