Newsgroup: it.comp.lang.c
Titolo: Problemi con la spedizione di un dato via serial

Ciao a tutti!
Ho un problema un po' strano...
Ordunque, ho scritto un programma che si occupa di scambiare dati via
RS232 con un MicroController.
Il programma funziona abbastanza bene, ma ogni tanto da' i numeri...
Spiego meglio:
Il programma scambia dei pacchetti dati cosi' formati:
1 Byte per la versione del protocollo
1 Byte per identificare il mittente (il �C ha piu' dispositivi attaccati)
1 Byte per identificare il destinatario
1 Byte per la dimensione dei dati
X Byte di dati
1 Byte per la parita'
Vengono quindi spediti i primi 4 bytes, e quindi i rimanenti.
Il ricevente aspetta i primi 4 bytes, alloca memoria per i dati e legge X
bytes di dati, quindi la parita'.
Viene poi fatto ovviamente il controllo di parita' e viene spedito un
ACK/NACK a seconda del caso.
La porta (/dev/ttyS0) viene aperta cosi':
  fd = open(modemDevice, O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (fd == -1)
  {
    sprintf(err, "Unable to open device [%s]", modemDevice);
    logger(err, LEVELERROR);
    return(-1);
  }
  else
  {
    tcgetattr(fd, &options);
    cfsetispeed(&options, baudRate);
    cfsetospeed(&options, baudRate);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~CRTSCTS;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_iflag &= ~INLCR;
    options.c_iflag &= ~ICRNL;
    options.c_oflag &= ~ONLCR;
    options.c_oflag &= ~OCRNL;
    tcsetattr(fd, TCSANOW, &options);
  }
Il problema si presenta quando i dati sono ESATTAMENTE 19 bytes.
In quel caso abbiamo un pacchetto come segue:
Versione: 2 // e' la seconda versione del protocollo... :)
From:     9 // la bussola, ma il problema si presenta anche con altri
dispositivi...
To:       1 // il PC
Size:    19
Data: 19 bytes di dati
Cosa succede? Succede che il ricevente, al posto di 19 legge 67 e si
aspetta quindi 67 bytes. Ovviamente la comunicazione fallisce perche' la
parita' e' completamente sbagliata e perche' i dati sono meno di quanto
lui si aspetta.
La domanda, pero', e': perche' mai il codice ASCII 19 viene tradotto in 67?
Qualche idea?
Grazie!
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Qualche idea?
S�, giusto un'idea. 19 coincide con XOFF, non � che per caso � 
attivo il controllo di flusso software?
HTH,
-- 
Stefano Frosio
www.esse-effe.com

 attivo il controllo di flusso software?
Mmmm... potrebbe essere un'idea...
Io NON ho attivato esplicitamente il controllo di flusso software.
Ho pero' scritto:
    options.c_cflag &= ~CRTSCTS;
che, da man, dovrebbe DISATTIVARE il controllo di flusso hardware.
Dici che e' quello?


 attivo il controllo di flusso software?
OK! Ho fatto una prova veloce, facendo parlare tra loro due istanze del
programma (adesso non ho il �C sottomano per i test).
Se scrivo:
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
nelle impostazioni della seriale tutto funziona alla perfezione.
Ora si tratta di vedere come reagisce il MicroController a questa
modifica...
Grazie della dritta!


 attivo il controllo di flusso software?
Provato adesso con il �C!
Tutto funziona alla perfezione!
Grazie mille! Era la dritta giusta!
ciao
