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.
La naturaleza del hardware del puerto serie hace que parte de su comportamiento sea impredecible. – zdav
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. –
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