2011-10-02 15 views
17

Sto costruendo un'applicazione per comunicare con un modulo Xbee tramite l'API Xbee.Come gestire il pacchetto send/ack

Attualmente ho qualcosa di funzionante, ma è abbastanza semplice e ha alcune limitazioni.

Sub processPackets() ' this runs as its own thread 
'remove data from serial buffer and format in to packet 
'if IO response generated remotely, not requested put in IOQueue 
'Otherwise put in CMDQueue (response generate from request, ie cmd response or packet Ack 
End Sub 

Poi, come un esempio di una richiesta di comando tipica Invia i dati alla porta seriale Loop (con timeout) controllando CMDQueue per pacchetto, dequeue e verificare se corrisponde Altrimenti timeout

Ora il suo abbastanza evidente i potenziali problemi con questo metodo. In particolare, poiché i moduli Xbee possono dormire, potrebbe essere necessario attendere molto tempo per un Ack. Inoltre dipende dall'ordine, ecc.

Mi piacerebbe adottare un approccio non bloccante. In questo caso, per agire sul pacchetto Ack/response nella maggior parte dei casi ho bisogno di sapere il pacchetto originale a cui è stato inviato in risposta.

Sto pensando di creare alcuni thread. SendPacket invierà il pacchetto, caricherà il pacchetto inviato, l'ora inviata e il timeout in memoria, includerà anche la funzione di richiamata? (array?) PacketProc analizza i pacchetti, controlla la matrice di pacchetti in attesa di risposta e chiama la funzione di callback. Verificherà anche eventuali pacchetti di attesa scaduti e richiamerà la richiamata per indicare il timeout?

In definitiva, sto cercando la capacità di inviare pacchetti a più dispositivi (può rispondere in qualsiasi ordine) e agire su quelle risposte o agire sul timeout.

Non ho particolare familiarità con .NET qualcuno può commentare questo approccio o consigliare un modello migliore per cercare? Qualunque metodo .Net dovrei cercare?

+4

Se si sono limitati alla comunicazione seriale, non sarà in grado di eseguire più thread con successo per uno strumento. Puoi eseguire un thread per strumento, se capisco cosa vuoi fare. –

+0

Ho un progetto che utilizza un emulatore speciale che ho creato con dsf di microsoft (framework di simulazione del dispositivo). Se si desidera utilizzarlo per emulare un dispositivo o testarne uno personalizzato, può accettare dispositivi personalizzati. Se hai bisogno di qualcosa di meglio dimmi, ma con dsf chiunque può simulare o testare qualsiasi cosa. Avrai bisogno di un endpoint esterno oltre all'endpoint per avere una comunicazione bidirezionale (i ragazzi di wdk sarebbero in grado di mostrarti come farlo). Funziona su un livello inferiore (codice non gestito/kernel da ms coinvolto) in modo che tu possa personalizzare il pacchetto prima di inviarlo. – jeffery

+0

scusa, ecco il link: http://kinectmultipoint.codeplex.com. Nota: per modificare il simulatore di dispositivo è necessario modificare softhidreceiver che si trova nel wdk sotto WinDDK \ 7600.16385.1 \ src \ test \ dsf \ usb \ GenericHID. Avrà una funzione o sottotitolo chiamato CreateReportDescriptor che ti permetterà di inserire il tuo dispositivo. Sono versioni vb.net e C++ per adattarsi al tuo gusto. – jeffery

risposta

1

Utilizzare la classe Attività.

Imports System.Threading 
Imports System.Threading.Tasks 

... 
Dim buffer As StringBuilder; 
Sub processPackets() ' this runs as its own thread 
    ' Wait for packet 
    ' put here command/loop that waits packet 

    buffer.Append(packet); 
    'remove data from serial buffer and format in to packet 
    'if IO response generated remotely, not requested put in IOQueue 
    If buffer.ToString() = "REMOTELY" Then 
     ' Put IOQueuo 
     buffer.Clear() 
    Else 
     'Otherwise put in CMDQueue (response generate from request, ie cmd response or packet Ack 
     ' Put in CMDQueue 
     buffer.Clear() 
    End If 
End Sub 

...

' Create and execute the Task that will process the packets 
Dim t = Task.Factory.StartNew(Sub() processPackets()) 

http://www.dotnetcurry.com/ShowArticle.aspx?ID=491

Problemi correlati