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!
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
Estoy un poco confundido acerca de las convenciones de nomenclatura. Por supuesto, lo alto está mal. Thx para la aclaración. – punischdude