Linux - porta serial read retornando EAGAIN
Estou com problemas para ler alguns dados de uma porta serial que abri da seguinte maneira. Eu usei essa instância de código muitas vezes e tudo funcionou bem, mas agora, por algum motivo que eu não consigo descobrir, eu sou completamente incapaz de ler qualquer coisa da porta serial.
Eu sou capaz de escrever e tudo é corretamente recebido no outro extremo, mas as respostas (que são enviadas corretamente) nunca são recebidas (Não, os cabos estão todos ok;))
O código que usei para abrir a porta serial é o seguinte:
fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd == -1)
{
Aviso("Unable to open port");
return (fd);
}
else
{
//Get the current options for the port...
bzero(&options, sizeof(options)); /* clear struct for new port settings */
tcgetattr(fd, &options);
/*-- Set baud rate -------------------------------------------------------*/
if (cfsetispeed(&options, SerialBaudInterp(BaudRate))==-1)
perror("On cfsetispeed:");
if (cfsetospeed(&options, SerialBaudInterp(BaudRate))==-1)
perror("On cfsetospeed:");
//Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; /* Parity disabled */
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE; /* Mask the character size bits */
options.c_cflag |= SerialDataBitsInterp(8); /* CS8 - Selects 8 data bits */
options.c_cflag &= ~CRTSCTS; // disable hardware flow control
options.c_iflag &= ~(IXON | IXOFF | IXANY); // disable XON XOFF (for transmit and receive)
options.c_cflag |= CRTSCTS; /* enable hardware flow control */
options.c_cc[VMIN] = 0; //min carachters to be read
options.c_cc[VTIME] = 0; //Time to wait for data (tenths of seconds)
//Set the new options for the port...
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd, TCSANOW, &options)==-1)
{
perror("On tcsetattr:");
}
PortOpen[ComPort] = fd;
}
return PortOpen[ComPort];
Depois que o port é initializeed eu escrevo algumas coisas para ele através do comando write simples ...
int nc = write(hCom, txchar, n);
onde hCom é o descritor de arquivo (e está tudo bem), e (como eu disse) isso funciona. Mas ... quando eu faço uma leitura depois, recebo um erro "Recurso temporariamente indisponível" do errno.
Eu testei selecionar para ver quando o descritor de arquivo tinha algo t ler ... mas sempre expira!
Eu leio dados como este:
ret = read(hCom, rxchar, n);
e eu sempre recebo um EAGAIN e não tenho ideia do porquê.
Atualizar:O HW está funcionando bem! Eu posso ver que há dados de entrada na porta serial porque eu fiz um cabo de depuração para ler o que está acontecendo em outro terminal. Assim...
Eu sei o que o nonblocking deveria fazer. Minha pergunta é ... por que não há nada sendo lido? A mesma configuração funciona bem no windows, então todo o hardware está funcionando bem ...
Isso está me deixando louco! Tenho certeza que é algo simples como o inferno! Eu até tentei me livrar do O_NONBLOCK para ver quando eu receberia algo ... mas nada ...