2010-06-07 23 views
5

ho scritto un codice nella piattaforma Linux che leggere i dati in porta seriale, il mio codice qui sotto:caratteri privi di porta seriale

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

Il mio problema è il codice di cui sopra non legge i primi dati che è stato trasmesso , quindi la seconda trasmissione i dati sono spazzatura, quindi il terzo è i dati normali.

Ho perso un'impostazione nella porta seriale?

Grazie.

+0

La natura hardware della porta seriale rende imprevedibili alcuni dei suoi comportamenti. – zdav

+0

A prima vista, mi chiedo se dovresti copiare old_opt in new_opt prima di sovrascrivere i valori. Come è possibile che tu stia inserendo valori non inizializzati da new_opt ... ma dovrei rivedere l'interfaccia di termios per essere sicuro. Quando dici che il primo non funziona e il secondo è confuso, intendi tre esecuzioni separate su questo programma, o stai eseguendo una versione diversa che esegue il ciclo? Mi chiedo se stai reimpostando l'impostazione di termios tra ogni corsa o meno. –

+0

L'immondizia sulla porta seriale indica in genere le impostazioni errate della porta seriale tra il mittente e il destinatario. Quali impostazioni stai utilizzando per il dispositivo che sta effettuando l'invio? Potrebbe anche essere d'aiuto se si sposta la stampa di rbuff dopo aver controllato il valore di ritorno da read() – Tree77

risposta

0

Se si sta parlando di una porta seriale hardware (RS-232), si consiglia di utilizzare un analizzatore di porta seriale come un BusBee per vedere cosa viene effettivamente inviato alla porta seriale. Se si utilizza un'ape bus, ricordare di posizionare un ricetrasmettitore prima di BusBee per regolare i livelli di tensione da RS-232 a TTL. In alternativa, se si ha accesso a un oscilloscopio, è possibile utilizzarlo per leggere i segnali sulle linee RS-232 e decodificare i byte da soli.

1

Sembra che le impostazioni della porta seriale siano disattivate, ad esempio, si sta leggendo a 8 bit anziché a 7. È avere in modo che entrambi i lati trasmettano con le stesse impostazioni.

Quello che vorrei fare è avere una tabella di "byte attesi, byte ottenuti" ed eseguirla per alcune prove 5-6.

Successivamente, se ciò non ti aiuta, fai girare il baud su entrambi i lati fino a 2400 circa. Si sono serio. Questo può correggere alcuni errori stravaganti.

Si dovrebbe indagare per mettere le mani su un oscilloscopio. Se si prevede che questo sia qualcosa che si mantiene a lungo termine, un o-scope può essere abbastanza utile.

Problemi correlati