2011-10-02 12 views
17

Estoy creando una aplicación para comunicarme con un módulo de Xbee a través de la API de Xbee.Cómo manejar el paquete send/ack

Actualmente tengo algo que funciona, pero es bastante simple y tiene bastantes limitaciones.

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 

A continuación, como ejemplo de una petición de comandos típica enviar datos al puerto serie Loop (con tiempo de espera) el control CMDQueue para el paquete, quitar de la cola y comprobar si coincide con De lo contrario el tiempo de espera

Ahora es bastante obvio los posibles problemas con este método. En particular, dado que los módulos Xbee pueden dormir, es posible que tenga que esperar un tiempo considerablemente prolongado para obtener un Ack. Además, depende del orden, etc.

Me gustaría adoptar un enfoque no bloqueante. En este caso, para actuar sobre el paquete Ack/response en la mayoría de los casos, necesito saber el paquete original en el que se envió.

Estoy pensando en crear algunos hilos. SendPacket enviará el paquete, cargará el paquete enviado, el tiempo enviado y el tiempo de espera en la memoria, ¿también incluirá la función de devolución de llamada? (matriz?) PacketProc analizará paquetes, comprobará la matriz de paquetes esperando respuesta y llamará a la función de devolución de llamada. También verificará si hay paquetes en espera que hayan expirado y llamará a la devolución de llamada para indicar el tiempo de espera.

En última instancia, estoy buscando la capacidad de enviar paquetes a múltiples dispositivos (puede responder en cualquier orden) y actuar en esas respuestas o actuar en el tiempo de espera.

No estoy particularmente familiarizado con .NET ¿alguien puede comentar sobre este enfoque o recomendar un mejor patrón para mirar? ¿Algún método .Net que debería ver?

+4

Si usted está limitado a la comunicación en serie, usted no será capaz de ejecutar múltiples hilos con éxito para un solo instrumento. Puede ejecutar un hilo por instrumento, si entiendo lo que quiere hacer. –

+0

Tengo un proyecto que está usando un emulador especial que creé con dsf (framework de simulación de dispositivos) de Microsoft. Si desea usarlo para emular un dispositivo o probar uno personalizado, puede aceptar dispositivos personalizados. Si necesitas algo mejor dime, pero con dsf cualquiera puede simular o probar casi cualquier cosa. Necesitará un punto final externo además del punto final interno para tener comunicación bidireccional (los muchachos de wdk podrían mostrarle cómo hacer esto). Esto funciona en un nivel inferior (código no administrado/kernel del ms involucrado) para que pueda personalizar el paquete antes de su envío. – jeffery

+0

lo siento aquí el enlace: http://kinectmultipoint.codeplex.com. Nota: para editar el simulador de dispositivo necesita editar softhidreceiver que se encuentra en la wdk bajo WinDDK \ 7600.16385.1 \ src \ test \ dsf \ usb \ GenericHID. Tendrá una función o sub llamada CreateReportDescriptor que le permite ingresar su propio dispositivo. Son versiones de vb.net y C++ que se adaptan a tu gusto. – jeffery

Respuesta

1

Use la clase Tarea.

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

Cuestiones relacionadas