posts - 463, comments - 1515, trackbacks - 139

Power off sul pocket e .... la seriale non ti risponde più

Credo che chiunque stia sviluppando sul compact framework conosca www.opennetcf.org, una pregevole iniziativa di alcuni programmatori, molti dei quali MVP, per estendere le funzionalità del Compact Framework.

Una delle librerie più apprezzate è quella per la comunicazione via seriale, anche perchè i device bluetooth (gps, lettori di codice a barre, etc.) sono mappati sui pocket pc su una seriale virtuale così come se fossero collegati ad un cavo (ma ovviamente non lo sono).

Il problema banale che ho riscontrato è che la libreria seriale interrompe la comunicazine qualora il pocket venga spento (o si spenga da solo per risparmiare le batterie). Nel momento in cui il pocket viene riacceso l'handle della seriale non sembra essere più valido, la comunicazione sullo stack bluetooth non è più valido, tipicamente il device bluetooth si scollega, e qualsiasi tentativo di spedire/ricevere dei byte fallisce.

Visto che il progetto è open source ho quindi ricompilato la libreria attivando una sorta di log su file per vedere cosa accade alla WaitCommEvent alla riaccensione del pocket. La WaitCommEvent è una API Win32 che mima la WaitForSingleObject sospendendo il thread in attesa di un evento dalla porta seriale. Bene, alla riaccensione la WaitCommEvent si risveglia lanciando un 'urlo' e recuperando l'ultimo errore Win32 si scopre che si è verificato un ERROR_GEN_FAILURE (vedi winerror.h delle librerie del C++).

Visto che il problema deriva dal fatto che ormai quell'handle della porta seriale non è più valido, la soluzione è semplice: riaprire la comunicazione seriale dopo un adeguato tempo di Sleep che permetta al Pocket di riprendersi per bene dopo la dormitina ;-).

La patch è quindi molto semplice e subito dopo la WaitCommEvent, avendo recuperato l'errore tramite Marshal.GetLastWin32Error, ho aggiunto:
      if(e == 31) // ERROR_GEN_FAILURE
      {
       System.Threading.Thread.Sleep(3500);
       hPort = m_CommAPI.CreateFile(portName);

       if(hPort == (IntPtr)CommAPI.INVALID_HANDLE_VALUE)
       {
        int MyErr = Marshal.GetLastWin32Error();
        if(MyErr == (int)APIErrors.ERROR_ACCESS_DENIED)
         return;

        string error = String.Format("CreateFile Failed: {0}", e);
        throw new CommPortException(error);
       }

Il risultato è che dopo la riaccensione, il pocket pc mostra nuovamente la scelta del device bluetooth a cui collegarsi. Questa è la classica schermata che appare sempre dopo l'apertura della seriale virtuale dello stack bluetooth ed è indispensabile perchè dopo un paio di minuti che non vengono usati, i device bluetooth entrano in una modalità di sleep per risparmiare le batterie.

Attualmente non ho ancora sottoposto la patch perchè sto valutando il tempo di sleep più adeguato a seconda dei pocket. Non escludo di dover alzare ancora un po' il valore di tre secondi e mezzo.

Print | posted on sabato 27 novembre 2004 14.13 | Filed Under [ Compact Framework [Italiano] ]

Feedback

Gravatar

# RE: Power off sul pocket e .... la seriale non ti risponde più

Onestamente l'unica feature che ho scartato dopo averla testata dell'OpenNetCf (che se non ci fosse sarebbe un dramma... o quasi) è proprio quella della comunicazione seriale per la porta virtuale del BT. Il problema che ho riscontrato con un GPS BT è quello del diverso comportamento della libreria a seconda dello stack BT con cui aveva a che fare. Con iPaq (quindi stack Widcomm) nessun problema con nessuna delle versioni di iPaq che ho utilizzato, invece grossi problemi di sincornizzazione con lo stack Microsoft (Qtek 2020). C'è da dire che lo stack Microsoft BT fa abbastanza pietà per onor di cronaca, tanto che lo ha capito anche la HTC (vero marchio dei Qtek) che per i suoi nuovi dispositivi è passata anch'essa a Widcomm. Per ovviare ho spulciato in rete, ho trovato del codice free che importa e utilizza direttamente le api di windows e ci ho costruito sopra un wrapper personalizzato per la lettura delle sentenze NMEA del GPS. con questo metodo anche se il ppc si spenge alla riaccensione nessun problema.
saluti
27/11/2004 14.29 | Roberto Messora
Gravatar

# re: Power off sul pocket e .... la seriale non ti risponde più

Interessante, quindi usi direttamente lo stack bluetooth? Io non lo uso per il GPS in questo momento e il service che viene installato automaticamente per quel device è la seriale. Se posti il link a quel sorgente di cui parli provo a darci un occhio ma ho l'impressione che la soluzione seriale sia di gran lunga più semplice (anche perchè ho già risolto :-))
27/11/2004 18.58 | Raffaele Rialdi
Gravatar

# re: Power off sul pocket e .... la seriale non ti risponde più

Io utilizzo l'opennetcf sullo stack widcomm(broadcom ad oggi) e chiamo direttamente le api per lo stack microsoft.
Da notare che le funzioni per accendere la radio bluetooth dell'opennetcf funzionano sullo stack microsoft e non sul widcomm....
11/02/2005 11.48 | Luca Vajani
Gravatar

# re: Power off sul pocket e .... la seriale non ti risponde più

Non sono al corrente di queste differenze. Non ho un device con stack widcomm.
Puoi però fare delle domande sul forum opennetcf perché gli autori della classe sono sempre in ascolto.
Suppongo sia solo un problema della libreria perché lo stack ha un driver per WinCE ed è poi gestito dalle API di WinCE che crea un layer di astrazione tra device fisico e modus operandi.
11/02/2005 13.25 | Raffaele Rialdi
Gravatar

# re: Power off sul pocket e .... la seriale non ti risponde più

Scusate l'intrusione
Ho un problema grave con il mio acer n30 e leggendo ho capito che siete molto esperti.
Ho aggiornato il mio acer n30 con windows 2003se e da allora, quando vado ad accoppiare il ricevitore holux gpslim 236, lo vede ma alla scansione delle porte sul palmare mi compare il messaggio "non è stata trovata alcuna porta seriale bluetooth per il ricevitore holux"
ho provato a cercare un aggiornamento del software del ricevitore, ma non c'è.

Dtaemi un aiuto, magari anche via mail.

Grazie, grazie.
Antonio
antonio.deluca@libero.it
13/04/2007 16.56 | Antonio
Gravatar

# re: Power off sul pocket e .... la seriale non ti risponde più

Antonio, queste sono domande sistemistiche, non di programmazione.

Per cortesia, fai la tua domanda sul newsgroup dei pocket:
microsoft.public.it.pocketpc
17/04/2007 9.15 | Raffaele Rialdi

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 4 and 2 and type the answer here:

Powered by: