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.
La natura hardware della porta seriale rende imprevedibili alcuni dei suoi comportamenti. – zdav
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. –
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