2012-06-04 9 views
13

मैं करने के लिए सॉफ्टवेयर लिख रहा हूँ यूएसबी होस्ट एपीआई द्वारा प्रदान का उपयोग कर और एक परिधीय उपकरण (Android संस्करण 4.0.3 और कर्नेल संस्करण 2.6.39.4 के साथ Motorola Xoom) गोली के बीच संवाद एंड्रॉयड।एंड्रॉयड यूएसबी होस्ट एपीआई: थोक हस्तांतरण बफर आकार

  • नियंत्रण: controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
  • थोक: मैं संचार के केवल दो प्रकार का उपयोग bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

नियंत्रण हस्तांतरण ठीक काम करता है, लेकिन मैं थोक हस्तांतरण के साथ एक समस्या है। मैं थोक ट्रांसफर फ़ंक्शन के लिए केवल बफर के आकार के रूप में 32768 का उपयोग कर सकता हूं। कम या ज्यादा उपयोग करना संभव नहीं है। मुझे पता है कि मैं बफर पाइप (आकार: 3276 9 बाइट्स) की सीमा के कारण अधिक उपयोग नहीं कर सकता।

यह परिधीय उपकरण उस डेटा को स्ट्रीम करता है जो थोक रूप से बल्कट्रान फ़ंक्शन द्वारा पढ़ा नहीं जाता है। मुझे लगता है कि कुछ डेटा खो गया है।

मैं इस लगता है: In Linux If a process attempts to read from an empty pipe (buffer), then read(2) will block until data is available. If a process attempts to write to a full pipe , then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete.

और उस पर आधारित है, समस्या की मेरी व्याख्या यह है कि कुछ डेटा को अवरुद्ध लिखने (2) समारोह द्वारा किए गए ध्वज की वजह से पाइप (बफर) के लिए लिखा नहीं है। क्या मैं सही हूँ? यदि यह सच है तो मैं पाइप बफर बदल सकता हूं।

  1. इस समस्या का मेरा पहला समाधान अधिक बफर है। For kernel >= 2.6.35, you can change the size of a pipe with fcntl(fd, F_SETPIPE_SZ, size) लेकिन यूएसबी पाइप के लिए मुझे fd (फ़ाइल डिस्क्रिप्टर) कैसे मिल सकता है?
  2. दूसरा विकल्प ulimit -p SIZE का उपयोग करना है, लेकिन मेरे कर्नेल के लिए पैरामीटर p पाइप के लिए नहीं है लेकिन प्रक्रिया है।

क्या किसी को भी एक ही समस्या का सामना करना पड़ा है, कोई समाधान?

+0

थोक हस्तांतरण का उपयोग कर, डेटा हानि के मुद्दे का भी सामना कर रहा है। इसमें देख रहे हैं। एक बार मुझे मूल कारण मिलने के बाद, मैं आपको बता दूंगा। स्थिति अद्यतन करते रहें। – yokks

+0

ठीक है, जानकारी के लिए धन्यवाद। – syntagma

+0

http://android.serverbox.ch/?p=370 क्या आप इस वार्तालाप से गुजर सकते हैं? आने वाले डेटा को संभालने के लिए यहां एक तर्क प्रस्तुत किया गया है। आशा है इससे आपकी मदद होगी। – yokks

उत्तर

2

आप एक यूएसबी डेटा विश्लेषक मिलना चाहिए, मैं का उपयोग कर इस एक: http://www.ellisys.com/products/usbex200/index.php

कुछ इस तरह का प्रयोग वास्तव में मुझे मदद की है जब मैं बात के एक ही प्रकार कर रहा था, मैं क्या पाया है कि आप कुछ प्रकार करना पड़ा था लूप के दौरान।

मेरे डिवाइस के लिए मैं पैकेट में आने वाले मेरे लिए, पैकेट दो नियंत्रण बाइट्स और डेटा के लिए 62 होगा डेटा के 64 बाइट्स था, इसलिए मेरे हस्तांतरण के लिए मैं की तरह

StringBuilder sb = new StringBuilder(); 
while(bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) > 2){ 
    for(int i = 2; i < buffer.length(); i++){ 
     sb.append((char) buffer[i]); 
    } 
} 

कुछ एक कुछ करने के लिए किया था लंबे समय तक इन लाइनों ने मेरे लिए अच्छा काम किया, मेरे पास बिल्कुल वही समस्या थी और इस तरह मैंने इसे ठीक किया। यदि आपको इसकी आवश्यकता है तो मेरे पास अधिक जानकारी है। बस टिप्पणी करें :)। मुझे पता है कि यह वास्तव में मेरे लिए निराशाजनक था। मैं एंड्रॉइड 4.0 के साथ एक एसर आइकोनिया ए 500 का उपयोग कर रहा हूँ।3 btw


Transferring larger amounts of data USB

Transferring data USB

+0

मेरे पास ऐसा कोई प्रकार नहीं है डिवाइस का मैंने डिवाइस और विंडोज प्लेटफ़ॉर्म के बीच स्थानांतरण की जांच करने के लिए केवल यूएसबीलीज़र का उपयोग किया।मुझे थोक ट्रांसफर में कोई नियंत्रण डेटा नहीं मिलता है और शायद पैकेट का अधिकतम आकार 512 बाइट है। क्या आपके पास कोई सुझाव है? – syntagma

0

AN232B-04_DataLatencyFlow.pdf के अनुसार, प्रवाह नियंत्रण अधिक डेटा दरों के लिए आवश्यक है:

यह दृढ़ता से कि प्रवाह नियंत्रण प्रोत्साहित किया जाता है प्रयोग किया जाता है, क्योंकि यह है यह सुनिश्चित करना असंभव है कि एफटीडीआई ड्राइवर हमेशा निर्धारित किया जाएगा।

क्या आपने अपने डेटा को सिंक्रनाइज़ करने के लिए फ्लो कंट्रोल विकल्प (आरटीएस/सीटीएस, डीटीआर/डीएसआर, एक्सओएन/एक्सओएफएफ) का उपयोग करने का प्रयास किया है?

"पैकेट के आकार के प्रदर्शन को प्रभावित और डाटा दर पर निर्भर है जाएगा सबसे बड़ा पैकेट बहुत ही उच्च गति के लिए,:

+0

मैंने प्रवाह नियंत्रण का प्रयास नहीं किया। मुझे इस तरह के समाधान का उपयोग नहीं करना चाहिए क्योंकि इससे अतिरिक्त विलंबता होगी। मैंने डिवाइस और विंडोज प्लेटफॉर्म के बीच यूएसबी ट्रांसफर का विश्लेषण किया और फ्लो कंट्रोल नहीं है। – syntagma

+0

@REACHUS: मेरी स्थिति समान है: एफटीडीआई से पढ़ना मेरे लिनक्स बॉक्स पर ठीक काम करता है लेकिन एंड्रॉइड टैबलेट पर डेटा खो देता है। चूंकि मैं 400kbps निरंतर डेटा ट्रांसफर (यूएसबी के माध्यम से ऑडियो रिकॉर्डिंग) करता हूं, मुझे संदेह है कि शायद टैबलेट हार्डवेयर/कर्नेल/ड्राइवर संयोजन उच्च डेटा दरों पर गलत व्यवहार करता है। आप की तरह, मुझे पता है कि मेरे लिनक्स मामले में कोई प्रवाह नियंत्रण नहीं किया जाता है, लेकिन शायद एंड्रॉइड चीजों पर अलग-अलग हैं, इस प्रकार सिफारिश। – gfour

1

ही .pdf Gfour पोस्ट के अनुसार, मैं वहाँ में इस पैरा पाया। आकार की आवश्यकता है। 'वास्तविक समय' अनुप्रयोगों के लिए जो 115200 बाउड पर ऑडियो डेटा स्थानांतरित कर रहे हैं, उदाहरण के लिए सबसे छोटा पैकेट वांछनीय है, अन्यथा डिवाइस एक समय में 4k डेटा रखेगा। इससे ' यूएसबी अनुरोध आकार बहुत बड़ा है और डेटा दर बहुत कम (अपेक्षाकृत) है। "

मैं एक एफटीडीआई सीरियल डिवाइस के साथ स्मार्टलेमन की तरह एक स्थिति में भाग रहा हूं, इसलिए मैं हाल ही में इसे कम करने के तरीकों की तलाश कर रहा हूं। इससे पहले कि मैं पुस्तकालय का उपयोग कर रहा था, इसके लिए मुझे अपने स्वयं के कार्यों को खरोंच से लिखने की आवश्यकता होगी।

हालांकि, ऐसा लगता है कि आपके मामले में, आप सबसे बड़ी शूटिंग के बजाए थोक ट्रांसफर के सबसे कम बफर आकार का उपयोग करने का प्रयास कर सकते हैं। आपने पहले ही यह कोशिश की हो सकती है, लेकिन शायद नहीं। मैं देखता हूं कि आप कहते हैं कि 32768 एकमात्र आकार है, लेकिन हो सकता है कि आप केवल अधिकतम का मतलब हो। यह अजीब लगता है कि यह केवल एक विशिष्ट आकार की अनुमति देगा।

-1

आप थोक स्थानांतरण संबंधी समस्या

byte[] buffer = new byte[4096]; 

      StringBuilder strIN = new StringBuilder(); 

      if (conn.bulkTransfer(epIN, buffer, 4096, 500) >= 0) { 
       for (int i = 2; i < 4096; i++) { 
        if (buffer[i] != 0) { 
         strIN.append((char) buffer[i]); 

         textReceiveDataInfo.append(strIN + "\n"); 
        } else { 
         l(strIN); 
         break; 
        } 
       } 

      } 
1

Android SDK के UsbEndpoint वस्तु है कि तुम क्या आपके डिवाइस के लिए उपयुक्त है की जाँच करने के लिए अनुमति देता है, एक getMaxPacketSize() तरीका प्रदान करता है के लिए यह कोशिश कर सकते हैं। आम तौर पर, अधिकतम स्वीकार्य पैकेट आकार यूएसबी 'फुल-स्पीड' उपकरणों के लिए 64 बाइट्स और 'हाई स्पीड' उपकरणों के लिए 512 है - 32,768 से कम आप कोशिश कर रहे हैं। क्या आप शायद कुछ उच्च स्तरीय प्रोटोकॉल के साथ अंतर्निहित यूएसबी पैकेट आकार को भ्रमित कर रहे हैं?

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