Windows CE 6.0 : SerialPort in .Net CF e stream driver names

In Windows CE, i devices gestiti mediante stream drivers sono acceduti utilizzando le API del file system (CreateFile, WriteFile, …) in quanto visti come dei veri e propri stream. Il Device Manager, che si occupa del caricamento dei drivers quando necessario (all’avvio del sistema o su richiesta), registra tre differenti namespaces per accedere agli stream drivers :

Legacy
Device based
Bus based

Il namespace Legacy prevede che lo stream driver sia indirizzato nella forma XXX[0-9]:, dove XXX rappresenta il prefisso indicativo del driver o tipologia di device (es. COM) e [0-9] è un indice che differenzia la possibilità di utilizzare la medesima istanza del driver per gestire più devices della stessa tipologia (es. COM1, COM2, …) ovviamente con contesti differenti. Tale indice è specificato nel registro di Windows. Questo tipo di namespace ha il limite di poter indirizzare fino a soli 10 devices della medesima tipologia, considerando il vincolo ad un cifra dell’indice. Tale limite viene superato utilizzando il namespace Device based che ha la seguente struttura \$device\XXX[index]. La seconda parte è la medesima della Legacy ma è preceduta dal namespace \$device. Con questo tipo di “indirizzamento” è possibile superare il limite dei 10 device, in quanto l’indice non è vincolato all’uso di una singola cifra. Infine, il namespace Bus based ha la seguente struttura \$bus\[bus_name]_[bus_number]_[device_number]_[function_number] dove però è necessario conoscere il bus a cui è connesso il device (nei casi di assenza di un bus specifico, esso ha tipicamente il valore di BuiltIn, che rappresenta la rootKey del registro di sistema da cui il Device Manager carica i drivers all’avvio).

Ultimamente, ho scoperto che queste tre tipologie di namespaces funzionano perfettamente quando utilizziamo la classe SerialPort su Windows CE 6.0, ovviamente nel caso in cui vogliamo accedere ad una porta seriale. Il namespace Legacy è quello che adottiamo normalmente (omettendo i : finali) ma può essere sostituito dal Device based, qualora dobbiamo accedere ad una porta seriale con indice maggiore di 9.

Legacy :

SerialPort sPort = new SerialPort("COM1");
sPort.Open();
sPort.Write("Hello World !");

Device based :

SerialPort sPort = new SerialPort("\$device\COM1");
sPort.Open();
sPort.Write("Hello World !");

Tutto ciò è garantito dal fatto che il metodo Open della classe SerialPort, al suo interno esegue una chiamata alla CommOpen della mscoree.dll che a sua volta invoca l’APICreateFile di Windows CE (presente nella coredll.dll). Quest’ultima prevede tra i parametri di ingresso il nome del device (o stream driver) a cui accedere, secondo i tre namespaces suddetti.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s