2011-10-02 28 views
17

Xbee APIを介してXbeeモジュールと通信するアプリケーションを構築しています。パケット送信/受信の処理方法

現在のところ、私は何かをしていますが、それはかなりシンプルで、かなりの制限があります。

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 

そして、典型的なコマンド要求 の一例として、シリアルポートにデータを送る ループ(タイムアウト付き)パケットのためのCMDQueueをチェックし、デキューし、それが と一致するかどうかを確認それ以外の場合は、タイムアウト

今そのかなり明白このメソッドの潜在的な問題。特に、Xbeeモジュールがスリープできるので、Ackのためにかなり長い時間待たなければならないかもしれません。プラスそれは注文などに依存します。

私はノンブロッキングのアプローチをとってみたいと思います。この場合、ほとんどの場合、Ack /応答パケットを処理するために、応答として送信された元のパケットを知る必要があります。

私はいくつかのスレッドを作成することを考えています。 SendPacketはパケットを送信し、送信されたパケットをロードし、送信された時間と、タイムアウトをメモリに送り、コールバック関数も含めますか? (配列?) PacketProcはパケットを解析し、応答を待っているパケットの配列をチェックし、コールバック関数を呼び出します。タイムアウトした待ちパケットをチェックし、タイムアウトを示すコールバックを呼び出しますか?

最終的には、複数のデバイスにパケットを送信したり(任意の順序で応答する可能性があります)、それらの応答に対して動作したり、タイムアウトに対応する機能を探しています。

私はこのアプローチに誰かがコメントしたり、より良いパターンを見てみることができます。私が調べるべき.Netメソッド

+4

あなたはシリアル通信に限定されている場合は、1台の機器に正常に複数のスレッドを実行することはできません。あなたが何をしたいのか分かっているなら、楽器ごとに1つのスレッドを実行することができます。 –

+0

私はマイクロソフトのdsf(デバイスシミュレーションフレームワーク)で作成した特別なエミュレータを使用しているプロジェクトを持っています。それを使ってデバイスをエミュレートしたり、カスタムデバイスをテストしたい場合は、カスタマイズされたデバイスを受け入れることができます。何か必要があれば教えてください。だがdsfを使って誰でもシミュレーションやテストをすることができます。双方向通信を行うには、エンドポイントに加えてアウトエンドポイントが必要です(wdkの人がこれを行う方法を示すことができます)。これは、下位レベル(msに含まれるアンマネージ/カーネルコード)で動作し、送信前にパケットをカスタマイズすることができます。 – jeffery

+0

申し訳ありませんがリンクをheres:http://kinectmultipoint.codeplex.com。注意:デバイスシミュレータを編集するには、WinDK \ 7600.16385.1 \ src \ test \ dsf \ usb \ GenericHIDのwdkにあるsofthidreceiverを編集する必要があります。それはあなた自身のデバイスを入力することができるCreateReportDescriptorと呼ばれる関数またはサブを持つでしょう。彼らはvb.netとあなたの味に合ったC + +のバージョンです。 – jeffery

答えて

1

タスククラスを使用します。

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

関連する問題