Newsgroup: it.comp.os.linux.development
Titolo: Gestione timeout su porte seriali

Salve, spero di non disturbarvi troppo con questa domanda (e spero che 
sia il newsgroup giusto dove farla).
Sto sviluppando una libreria in linguaggio "C" per la gestione delle 
porte seriali in maniera "portabile" Windows/Linux. Sono gia` arrivato a 
circa un 80% del lavoro per completarla. Diciamo che al momento ho 
voluto evitare tutto cio` che e` particolarmente "esotico" (enumerazione 
delle porte disponibili, I/O asincrono, ecc...). Inoltre non ho gestito 
tutto cio` che, in modo evidente e palese, non e` presente su entrambe 
le piattaforme (es. handshake automatico DTR/DSR che c'e` solo su 
Windows o ancora il bit di stop 1,5 che e` gestito solo su Windows o il 
"canonical mode" che esiste solo su Linux).
C'e` una cosa invece che mi interessa gestire e anche molto bene e 
sarebbe la gestione dei timeout. Su Windows non avrei problemi, MSDN e` 
molto chiara su questo punto e ho capito molto bene come sono gestiti i 
timeout (vedere i link a MSDN qui sotto, per chi non fosse a conoscenza).
Il fatto e` che su Linux ... non ho capito perfettamente cosa posso fare 
per gestire i timeout in maniera simile a quello che fa Windows. Su 
Linux ho visto che si possono usare le opzioni VMIN e VTIME ma ... mi 
sembra che questa gestione sia alquanto limitata rispetto a Windows.
La questione poi e` anche un'altra: quale e`, secondo voi, il modo 
migliore per gestire i timeout? Mi spiego meglio: devo ricevere 10 
caratteri. Cosa si dovrebbe fare?
a) Questi 10 caratteri devono essere ricevuti in un tempo massimo X 
(altrimenti timeout).
b) Ogni carattere deve essere ricevuto entro un tempo massimo X 
(altrimenti timeout).
c) Un insieme delle due sopra.
d) Altro modo.
Chiedo quindi aiuto a qualcuno che magari ha gia` avuto esperienza con 
questo tipo cose per avere informazioni, link o quant'altro per capire 
cosa fare con i timeout su Linux.
Grazie! :)
Gestione seriale su MSDN:
http://tinyurl.com/b7eaq
http://tinyurl.com/2y67z
http://tinyurl.com/azz5h

 
Conosci la funzione select()?
Vedi anche le FAQ postate ogni mese su questo gruppo.
Alessandro.

 Alessandro.
Grazie.

 giorni.
esempio 4.1 .
Li' e' per i socket, ma la soluzione e' identica per i file descriptor
E mi sembra che la storia sulla select sia presente anche nel Serial


 d) Altro modo.
...
Se la libreria vuole essere un layer di trasporto (come ad esempio libusb)
mi aspetterei di specificare un timeout da applicare ad un'intera
operazione, sia in questo caso la lettura di 10 byte.
Quindi risposta a.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
	**ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
 -<! Woe to you, oh Earth and Sea, for the Devil sends the Beast with
      wrath, because He knows the time is short... !>- Revelations, XIII - 18

 stata svegliata???
Read ritorna sempre il numero di byte presenti (indipendentemente da
quanti gliene chiedi), dato che sai che ci sono (te l'ha detto select, se
non ha ritornato 0) non puo` bloccarsi, e` a questo che serve select. 
Se non bastano fai un loop. Con Linux la select ti cambia anche la
variabile con il timeout per dirti quanto tempo e` rimasto, cosi` puoi
riusarla anche cumulativamente (e dire aspetto 10 sec per 10 caratteri).
Tieni conto pero` che se lo fai non sara` portabile su altri Unix
(pertanto se vuoi fare le cose in generale te lo sconsiglio).
Ciao
Simone