Newsgroup: it.comp.programmare.win32
Titolo: ancora sulla seriale

Scusate l'ignoranza, ma non riesco a capire come si puo' leggere
dalla seriale in modo asincrono (cioe' senza che il programma si blocchi
in attesa di dati)
Pensavo che impostando i timeout come riporto sotto fosse sufficiente,
ma sebra che vada tutto in crash.
HANDLE hndCom=CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE,
                   0,                    // exclusive access
                   NULL,                 // no security attrs
                   OPEN_EXISTING,
                   FILE_ATTRIBUTE_NORMAL |
                   FILE_FLAG_OVERLAPPED, // overlapped I/O
                   NULL );
char buf[1024];
memset(buf,0,sizeof(buf));
DWORD readB;
struct _OVERLAPPED ov;
COMMTIMEOUTS comT;
comT.ReadIntervalTimeout=MAXDWORD;
comT.ReadTotalTimeoutConstant=0;
comT.ReadTotalTimeoutMultiplier=0;
comT.WriteTotalTimeoutConstant=0;
comT.WriteTotalTimeoutMultiplier=0;
int a=ReadFile(hndCom,&buf,100,&readB,&ov); //qui si pianta tutto
 
CloseHandle(hndCom);
Qualcuno sa come si puo' fare a leggere in modo asincrono ?
Grazie,
Marco Guidi

chiedo scusa, naturalmente manca la chiamata
	SetCommTimeouts(hndCom,&comT);
subito prima della ReadFile. Comunque anche con questa
sembra che si pianti spesso,
Marco Guidi


a=ReadFile(hndCom,&buf,100,&readB,&ov
Se usi ReadFile in modalità asincrona devi inizializzare la struttura 
OVERLAPPED in modo corretto impostando l'offset di lettura e l'event 
utilizzato per segnalare il completamento dell'operazione.
Inoltre al posto di &buf devi utilizzare buf (buf è un char* che punta a un 
buffer di 1024 caratteri &buf è l'indirizzo (sullo stack) in cui è 
memorizzato il puntatore al buffer).
Nei tuoi prossimi post ti prego di definire in modo più tecnico/oggettivo 
"va tutto in crash":
-La funzione torna errore? Se richiami GetLastError() quale codice torna?
-Il debugger segnala un'eccezione? In che funzione? Hai controllato che i 
dati passati alla funzione siano validi?
-Il programma va in GPF o parte dr. watson? Lancialo da dentro un debugger 
e torna al punto precedente.
-Si pianta il PC? 
-Scompare ogni forma di vita sulla terra? 
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

Ti ringrazio.
Ho appena letto un po' di documentazione
ulteriore sulla seriale.
Effettivamente non avevo capito che si doveva creare
un evento.
Ho anche trovato una classe CSerial in giro per internet,
anche se ancora non ho controllato se e come funziona.
scusa se rompo ancora ma...che significa
"Hai controllato che i  dati passati alla funzione siano
validi"?
Ci sono forse alcuni caratteri che non possono essere
spediti sulla seriale ?
Marco Guidi.
"Va tutto in crash" si riferiva solo al fatto
che probabilmente, non essendo impostata la ReadFile in modo
corretto, questa non ritornava (probabilmente attendeva
la terminazione della operazione che non avveniva mai,
visto che nessuno scriveva sulla seriale).



Generalmente no. 
L'unico caso che mi viene in mente č la combinazione +++AT<comando> inviata 
a un modem anche se, in teoria, tra i tre + e il comando at ci deve essere 
una pausa di alcuni secondi. Leggende metropolitane narrano di modem 
"farlocchi" che non gestiscono correttamente la cosa e possono generare 
errori.
