Comunicação Serial Ubuntu: lê falhas e depois chega de uma só vez

Estou escrevendo um programa que é executado em um computador de placa única MIO-3260 executando o servidor Ubuntu 14.04 e se comunica com uma unidade AMC DPRANIE C100A400. O programa envia uma cadeia de códigos hexadecimais para a unidade e deve receber uma resposta para cada mensagem que envia. Quando eu tento no realTerm no Windows, isso funciona bem, então eu não acho que seja um problema com a unidade. No entanto, quando tento ler a partir da porta serial, read () retorna -1 quase o tempo todo, até que de repente em um ponto aparentemente aleatório, recebo uma descarga maciça de mensagens de uma só vez.

Estou usando termios para configurar a porta serial. Aqui está o meu código para isso. Eu tentei configurá-lo em uma configuração de bloqueio, mas se eu fizer isso, o código trava indefinidamente na primeira leitura ().

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 ler da porta serial, meu código é o seguinte:

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");
}

Aqui está um exemplo do tipo de mensagem que eu deveria receber {0xA5 0xFF 0x10 0x01 0x00 0x00 0xD4 0x11}. Deve ter entre 8 e 14 bytes de comprimento. Em vez disso, recebo um grande número de uma só vez e nenhum em outros momentos (por exemplo, recebi 810 bytes de uma só vez depois de enviar 946 comandos sem resposta).

Venho solucionando problemas nos últimos dias e não faço ideia do que está acontecendo. Às vezes, eu o executo e ele responde a maior parte do tempo e, misteriosamente, simplesmente para e volta intermitentemente.

Informe-me se houver mais informações que eu possa fornecer.

Qualquer ajuda seria muito apreciada!

ATUALIZAÇÃO: Conectei meu laptop também à porta serial para poder espionar as transmissões usando o RealTerm e verifiquei se os comandos estão sendo enviados pelo MIO-3260 corretamente e respondidos corretamente pela unidade. Portanto, o problema parece ser quando tento ler a partir da porta.

questionAnswers(1)

yourAnswerToTheQuestion