Ubuntu Serial Communication: lee errores y luego entra de una vez

Estoy escribiendo un programa que se ejecuta en una computadora de placa única MIO-3260 con el servidor Ubuntu 14.04 y se comunica con una unidad AMC DPRANIE C100A400. El programa envía una cadena de códigos hexadecimales a la unidad y se supone que recibe una respuesta por cada mensaje que envía. Cuando lo intento en realTerm en Windows, esto funciona bien, así que no creo que sea un problema con la unidad. Sin embargo, cuando intento leer desde el puerto serie, read () devuelve -1 casi todo el tiempo, hasta que de repente, en un punto aparentemente aleatorio, recibo un volcado masivo de mensajes de una vez.

Estoy usando termios para configurar el puerto serie. Aquí está mi código para eso. Intenté configurarlo en una configuración de bloqueo, pero si lo hago, el código simplemente se cuelga indefinidamente en la primera lectura ().

int fd;
fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
struct termios SerialPortSettings;

tcgetattr(fd, &SerialPortSettings); //get current settings of serial port
cfsetispeed(&SerialPortSettings,B115200);//set input baud rate
cfsetospeed(&SerialPortSettings,B115200);//set output baud rate
SerialPortSettings.c_cflag &= ~PARENB;//clear parity bit (no parity)
SerialPortSettings.c_cflag &= ~CSTOPB;//Stop bits = 1
SerialPortSettings.c_cflag &= ~CSIZE;//clears the mask
SerialPortSettings.c_cflag |= CS8; //set data bits = 8
SerialPortSettings.c_cflag &= ~CRTSCTS; //turn off hardwar based flow ctrl
SerialPortSettings.c_cflag |= CREAD | CLOCAL;//Turn on the reciever

SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); //Turn off software
//based flow control
SerialPortSettings.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);//Non-canonical mode
SerialPortSettings.c_oflag &= ~OPOST;//no output processing
//set the termios struct now
if(tcsetattr(fd,TCSANOW,&SerialPortSettings) != 0)
    printf("\n ERROR: setting attributes");
else
    printf("\n Baudrate = 115200 \t Stopbits = 1 \t Parity = none");

Para leer desde el puerto serie, mi código es el siguiente:

uint8_t buf[1024];//Rx buffer
int bytes_read;
bytes_read = read(fd,&buf,1024);
if(bytes_read != -1){
        for(int i=0;i<bytes_read;i++)    /*printing only the received characters*/
                printf("%02X\t",buf[i]);
        puts("\n");
}

Aquí hay una muestra del tipo de mensaje que debería recibir {0xA5 0xFF 0x10 0x01 0x00 0x00 0xD4 0x11}. Debe tener entre 8 y 14 bytes de longitud. En cambio, recibo un gran número de una vez y ninguno en otras ocasiones (por ejemplo, acabo de recibir 810 bytes a la vez después de enviar 946 comandos sin respuesta).

Lo he estado solucionando durante los últimos días y no tengo idea de lo que está sucediendo. A veces lo ejecuto y responde la mayor parte del tiempo y luego, misteriosamente, simplemente se detiene y vuelve intermitentemente.

Avíseme si hay más información que pueda proporcionar.

¡Cualquier ayuda sería muy apreciada!

UPDATE: también conecté mi computadora portátil al puerto serie para poder espiar las transmisiones usando RealTerm, y verifiqué que el MIO-3260 envía los comandos correctamente y que la unidad los responde correctamente. Entonces, el problema parece ser cuando intento leer desde el puerto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta