2011-12-22 19 views
11

Estoy tratando de leer los bytes sin procesar de un puerto serie enviado por un simulador de protocolo IEC 870-5-101 win32 con un programa escrito en C que se ejecuta en Linux de 32 bits.Lectura de bytes sin formato desde un puerto en serie

Funciona bien para valores de bytes como 0x00 - 0x7F. Sin embargo, para los valores que comienzan desde 0x80 a 0xAF el bit alto es erróneo, por ejemplo .:

0x7F -> 0x7F //correct 
0x18 -> 0x18 //correct 
0x79 -> 0x79 //correct 
0x80 -> 0x00 //wrong 
0xAF -> 0x2F //wrong 
0xFF -> 0x7F //wrong 

Después de excavar alrededor de dos días, no tengo ni idea, lo que está causando esto.

Esta es mi configuración del puerto serie:

cfsetispeed(&config, B9600); 
    cfsetospeed(&config, B9600); 

    config.c_cflag |= (CLOCAL | CREAD); 

    config.c_cflag &= ~CSIZE;        /* Mask the character size bits */ 
    config.c_cflag |= (PARENB | CS8);      /* Parity bit Select 8 data bits */ 

    config.c_cflag &= ~(PARODD | CSTOPB);     /* even parity, 1 stop bit */ 


    config.c_cflag |= CRTSCTS;        /*enable RTS/CTS flow control - linux only supports rts/cts*/ 


    config.c_iflag &= ~(IXON | IXOFF | IXANY);    /*disable software flow control*/ 

    config.c_oflag &= ~OPOST;        /* enable raw output */ 
    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /* enable raw input */ 

    config.c_iflag &= ~(INPCK | PARMRK);     /* DANGEROUS no parity check*/ 
    config.c_iflag |= ISTRIP;        /* strip parity bits */ 
    config.c_iflag |= IGNPAR;        /* DANGEROUS ignore parity errors*/ 

    config.c_cc[VTIME] = 1;         /*timeout to read a character in tenth of a second*/ 

estoy leyendo desde el puerto serie con:

*bytesread = read((int) fd, in_buf, BytesToRead); 

Justo después de esta operación "in_buf" contiene el byte mal, por lo Supongo que hay algo mal con mi configuración, que es un puerto de una estructura win32 DCB.

¡Gracias por cualquier idea!

+0

Noto que ha dicho que "los segundos 4 bits son incorrectos ..." pero parece que sus datos solo muestran que se borra el bit alto. (& 0x7f) – BRFennPocock

+0

Estoy un poco confundido acerca de las convenciones de nomenclatura. Por supuesto, lo alto está mal. Thx para la aclaración. – punischdude

Respuesta

14

Según sus ejemplos, solo el octavo bit (el bit alto) es incorrecto, y está mal siempre siendo 0. Está configurando ISTRIP en su disciplina de línea en el lado de Linux, y eso causaría esto. ISTRIP no elimina los bits de paridad, como dice el comentario en el código C. Quita el octavo bit de datos.

Si se establece ISTRIP, los bytes de entrada válidos se quitarán primero a siete bits; de lo contrario, se procesarán los ocho bits. IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface

+0

Gracias por la información sobre 8E1. Nunca lo supo. –

+0

Gracias! 'config.c_iflag & = ~ ISTRIP;' hizo el truco. – punischdude

+0

Me encantan esos comentarios engañosos. –

Cuestiones relacionadas