posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

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 16: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 16:29 | Roberto Messora
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 15:25 | Raffaele Rialdi
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 12:15 | Raffaele Rialdi
Gravatar

# Shell motiva norco.

Norco medication. Norco. Local news station for norco california. Sierra vista elementary norco ca. How to buy norco without prescription. Norco fire.
01/07/2009 14:22 | Norco medication.
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET