Newsgroup: it.comp.os.linux.development
Titolo: parita' e seriale ISTRIP

ho un curioso problema:
imposto la seriale in questo modo:
	fd = open(PORTA, O_RDWR | O_NOCTTY | O_NDELAY);
	if(fd < 0) {
		perror(PORTA);
		exit(-1);
	}
 
	fcntl(fd, F_SETFL, 0);
	bzero(&newtio, sizeof(newtio));
	newtio.c_cflag |= (CREAD | CLOCAL);
 
	//flow control
	//newtio.c_cflag |= CRTSCTS;
	newtio.c_cflag &= ~CRTSCTS;	
 
	//8 bit
	newtio.c_cflag &= ~CSIZE;
	newtio.c_cflag |= CS8;
 
	//parity E
	newtio.c_cflag |= PARENB;
	newtio.c_cflag &= ~PARODD;
	newtio.c_cflag &= ~CSTOPB;
 
	//baudrate
	cfsetispeed(&newtio, BAUDRATE);
	cfsetospeed(&newtio, BAUDRATE);
 
	//raw input
	newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
 
	//parity check
	newtio.c_iflag |= (INPCK | ISTRIP);
	//raw output
	newtio.c_oflag &= ~OPOST;
 	newtio.c_cc[VTIME]    = 10;
	newtio.c_cc[VMIN]     = 0;
	tcsetattr(fd, TCSANOW, &newtio);
il problema e' il seguente. quando ricevo un byte con il MSB ad 1, ad
es. FF:
- se imposto ISTRIP, leggo 7F
- se non lo imposto, leggo FF
siccome uso la parita' mi sembra corretto mettere ISTRIP...
un altro problema e' dovuto al controllo di flusso hw:
se lo abilito, il device collegato non mi capisce
se lo disabilito, mi capisce
non sarebbe un gran problema se non mi fosse stato riportato che su
windows funziona in entrambi i modi... qui navigo in alto mare e non
ho sospetti sulla causa.
-- 
Seti@Home Java Applets
http://maruko.cjb.net/
http://maruko.cjb.net/bofh.jsp

windows funziona in entrambi i modi...
Non credo che il sistema
operativo influenzi molto il comportamento delle seriali, non dal punto di
vista del protocollo di sync utilizzato (RTS-CTS o ACK-NACK). 
D'altro
canto, ti posso assicurare che ho impattato con diversi emulatori di
terminale per WIN su RS232, che lavorano tranquillamente sia con il sync
software che con quello hw...
Fondamentalmente, occorre stabilire che
tipo di cablaggio vuoi realizzare, se vuoi cioè gestire solo i segnali "2-
3-7" (protocollo software), o se vuoi spingerti a controllare anche il "4-
5" e magari "8-20" (RTS-CTS, con eventuale CD e ring sensing)
Se la
seriale target non è configurabile, cosa che accade sovente per certi
apparati specifici, allora dovrai utilizzare un protocollo sull'altra
seriale che sia compatibile in termini di disciplina.
Ciao, Sandro.
--------------------------------
Inviato via 
http://usenet.iol.it
 


e' configurabile ma non per quanto riguarda il controllo di flusso.
ciao


baracchino. controllero' anche il cavo comunque.
Procurati un serial-
tester, uno di quegli scatolotti passanti con i led verdi e rossi, che
indicano quali segnali ci sono e quali no. Spesso, basta invertire il 4-5 e
2-3 per veder tutto magicamente funzionare ... ;-)


"istrip parenb cstopb" con 9 bit, con "istrip parenb -cstopb" con 8.
Eh
eh, è da un po che non faccio le addizioni in colonna ... ;-)
Ovviamente
i numeri di sopra sono 11, 10 e 9. Ad 8 ci si arriva disabilitando il
generatore di parità.
Da giocare _rigorosamente_ sulla ruota di Bari ;-)


"istrip parenb cstopb" con 9 bit, con "istrip parenb -cstopb" con 8.
ok, allora 8E1 saranno 8 + 1 + 1 = 10
quando faccio una read vorrei vedere solo il dato pulito, me ne frego
di stop e parita' (che vengono gestite dall'hw della seriale o dal
s.o.). quindi, ci va o no istrip? secondo me si' ma dall'esperienza
che ho avuto no.
da quello che dici, sembra che istrip incida su quello che viaggia sul
cavo... se imposto istrip e parita' cosa succede? che sul cavo non
viaggia piu' il bit di parita'?! mi sembra strano. da quello che avevo
capito, istrip diceva al driver di non mostrarmi il bit di parita'
quando facevo le read.
come documentazione sto usando "Serial programming guide for posix
systems" e, riguardo a ISTRIP dice:
Setting Input Parity Options
You should enable input parity checking when you have enabled parity
in the c_cflag member (PARENB).
The revelant constants for input parity checking are INPCK, IGNPAR,
PARMRK, and ISTRIP. Generally you
will select INPCK and ISTRIP to enable checking and stripping of the
parity bit:
options.c_iflag |= (INPCK | ISTRIP);
come i bit girano sul cavo fisico non mi interessa (a livello di
programma). voglio usare la parita' per avere un po' piu' di sicurezza
nella trasmissione (parita' E), ma poi voglio trattare solo i dati
veri (8 bit) e usare un solo bit di stop (uno solo se no il baracchino
con cui parlo non ci salta fuori).


con cui
parlo non ci salta fuori).
Allora "parenb -parodd -cstopb clocal". Le
read() leggeranno caratteri ad 8 bit.
Poi, ovviamente, devi risolvere il
problema del sync hw o sw.



ok, ma spiegami perche' non devo mettere istrip.
