2010-06-07 24 views
5

yo escribimos un código en la plataforma Linux que lee los datos de puerto serie, mi código de abajo:datos de la basura desde el puerto serie

int fd; 
char *rbuff=NULL; 
struct termios new_opt, old_opt; 
int ret; 

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); 
if(fd == -1) 
{ 
    printf("Can't open file: %s\n", strerror(errno)); 
    return -1; 
} 
tcgetattr(fd, &old_opt); 
new_opt.c_cflag = B115200 | CS8 | CLOCAL | CREAD; 
new_opt.c_iflag = IGNPAR /*| ICRNL*/; 
new_opt.c_oflag = 0; 
new_opt.c_lflag = ICANON; 

tcsetattr(fd, TCSANOW, &new_opt); 
rbuff = malloc(NBUFF); 
printf("reading..\n"); 
memset(rbuff,0x00,NBUFF); 
ret = read(fd, rbuff, NBUFF); 
printf("value:%s",rbuff); 
if(ret == -1) 
{ 
    printf("Read error:%s\n",strerror(errno)); 
    return -1; 
} 
tcsetattr(fd, TCSANOW, &old_opt); 
close(fd); 

Mi problema es el código anterior no ha leído los primeros datos que se transmite , luego la segunda transmisión los datos son basura, luego el tercero es la información normal.

¿Me perdí una configuración en el puerto serie?

Gracias.

+0

La naturaleza del hardware del puerto serie hace que parte de su comportamiento sea impredecible. – zdav

+0

A primera vista, me pregunto si deberías copiar old_opt en new_opt antes de anular los valores. Tal como está, podrías estar poniendo valores no inicializados de new_opt ... pero tendría que revisar la interfaz de termios para estar seguro. Cuando dice que el primero no funciona y el segundo está distorsionado, ¿quiere decir tres ejecuciones por separado en este programa, o está ejecutando una versión diferente que se repite? Me pregunto si está restableciendo la configuración de termios entre cada ejecución o no. –

+0

basura en el puerto serie generalmente indica una configuración incorrecta del puerto serie entre el emisor y el receptor. ¿Qué configuración está utilizando para el dispositivo que está enviando? También podría ser útil si mueve su impresión de rbuff después de comprobar el valor de retorno de read() – Tree77

Respuesta

0

Si está hablando de un puerto serie de hardware (RS-232), le recomendaría usar un analizador de puerto serie como BusBee para ver lo que realmente se está enviando al puerto serie. Si usa una abeja de bus, recuerde también colocar un transceptor antes de BusBee para ajustar los niveles de voltaje de RS-232 a TTL. Alternativamente, si tiene acceso a un osciloscopio, puede usarlo para leer las señales en las líneas RS-232 y decodificar los bytes usted mismo.

1

Suena como que la configuración de su puerto serie está desactivada, supongo que está leyendo en 8 bits en lugar de 7. Usted tiene para que ambos lados transmitan con la misma configuración.

Lo que haría es tener una tabla de "bytes esperados, bytes obtenidos", y ejecutarla durante unos 5-6 intentos.

A continuación, si eso no lo ayuda, haga girar el baud en ambos lados hasta 2400 o menos. Si hablo en serio. Eso puede arreglar algunos errores extraños.

Debe investigar poner sus manos en un osciloscopio. Si anticipa que esto es algo que está manteniendo a largo plazo, un O-scope puede ser bastante útil.

Cuestiones relacionadas