2011-10-02 15 views
17

को कैसे संभालें I 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 जाँच और जाँच के रूप में इस विधि के साथ संभावित मुद्दों। विशेष रूप से, चूंकि एक्सबी मॉड्यूल सो सकता है, इसलिए आपको एक के लिए काफी लंबा समय इंतजार करना पड़ सकता है। इसके अलावा यह आदेश पर निर्भर है, आदि

मैं एक गैर-अवरुद्ध दृष्टिकोण लेना चाहता हूं। इस मामले में, ज्यादातर मामलों में एएसी/प्रतिक्रिया पैकेट पर कार्य करने के लिए मुझे मूल पैकेट को जानने की आवश्यकता है जिसे इसे भेजा गया था।

मैं कुछ धागे बनाने की सोच रहा हूं। SendPacket पैकेट भेज देगा, भेजे गए पैकेट को लोड करेगा, समय भेजा जाएगा, और स्मृति में टाइमआउट, कॉलबैक फ़ंक्शन भी शामिल होगा? (सरणी?) पैकेटप्रोक पैकेट को पार्स करेगा, प्रतिक्रिया के लिए प्रतीक्षा करने वाले पैकेट की सरणी जांचें और कॉलबैक फ़ंक्शन को कॉल करें। यह किसी भी प्रतीक्षा पैकेट की जांच भी करेगा जो टाइमआउट को इंगित करने के लिए कॉलबैक का समय समाप्त कर चुका है?

आखिरकार मैं कई उपकरणों पर पैकेट भेजने की क्षमता ढूंढ रहा हूं (किसी भी क्रम में प्रतिक्रिया दे सकता हूं) और उन प्रतिक्रियाओं पर कार्य कर सकता हूं या टाइमआउट पर कार्य कर सकता हूं।

मैं विशेष रूप से .NET से परिचित नहीं हूं। क्या कोई इस दृष्टिकोण पर टिप्पणी कर सकता है या देखने के लिए बेहतर पैटर्न की सिफारिश कर सकता है? किसी भी .NET तरीकों में मुझे देखना चाहिए?

+4

आप धारावाहिक संचार के लिए सीमित हैं, तो आप एक साधन करने के लिए सफलतापूर्वक एक से अधिक थ्रेड चलाने के लिए सक्षम नहीं होगा। यदि आप समझ रहे हैं कि आप क्या करना चाहते हैं, तो आप एक थ्रेड प्रति उपकरण चला सकते हैं। –

+0

मेरे पास एक प्रोजेक्ट है जो माइक्रोसॉफ्ट के डीएसएफ (डिवाइस सिमुलेशन फ्रेमवर्क) के साथ बनाए गए एक विशेष एमुलेटर का उपयोग कर रहा है। यदि आप किसी डिवाइस को अनुकरण करने या अपने स्वयं के कस्टम एक का परीक्षण करने के लिए इसका उपयोग करना चाहते हैं तो यह अनुकूलित डिवाइस स्वीकार कर सकता है। अगर आपको कुछ बेहतर चाहिए तो मुझे बताएं लेकिन डीएसएफ के साथ कोई भी कुछ भी सिमुलेट या परीक्षण कर सकता है। आपको दो तरह के संचार के लिए एंडपॉइंट के अलावा एक एंड एंडपॉइंट की आवश्यकता होगी (wdk लोग आपको यह दिखाने में सक्षम होंगे कि यह कैसे करें)। यह निचले स्तर पर काम करता है (एमएस से अप्रबंधित/कर्नेल कोड) ताकि आप अपने भेजे जाने से पहले पैकेट को कस्टमाइज़ कर सकें। – jeffery

+0

खेद है कि लिंक है: http://kinectmultipoint.codeplex.com। नोट: डिवाइस सिम्युलेटर को संपादित करने के लिए आपको softhidreceiver को संपादित करने की आवश्यकता है जो wdk में WinDDK \ 7600.16385.1 \ src \ test \ dsf \ usb \ GenericHID के अंतर्गत है। इसमें 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

संबंधित मुद्दे