2008-09-26 16 views
32

मैं एक गैर-उत्तरदायी यूएसबी डिवाइस को ठीक करने की कोशिश कर रहा हूं जो वर्चुअल COM पोर्ट के रूप में मजाक कर रहा है। मैनुअल रीप्लगिंग काम करता है, लेकिन इनमें से 12 इकाइयां हो सकती हैं। अनप्लग/प्रतिलिपि चक्र के प्रोग्रामेटिक समकक्ष करने के लिए कोई एपीआई कमांड है?एक मनमानी यूएसबी डिवाइस प्रोग्रामेटिक रूप से अनप्लग और दोहराने के लिए कैसे?

+0

की [सुरक्षित यूएसबी ड्राइव को हटाने Win32 एपीआई का उपयोग कर?] (Http://stackoverflow.com/questions/85649/safe-remove-usb-drive-using-win32-api) –

+0

सॉफ्टवेयर की तरह संभव डुप्लिकेट यूएसबी सुरक्षित रूप से निकालें पूरे यूएसबी हब को पुनरारंभ करके अनप्लग्ड यूएसबी डिवाइस को दोबारा जोड़ने में सक्षम है (अन्य कनेक्टेड डिवाइसों को लागू करना)। –

उत्तर

3

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

0

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

आपने शायद इसके बारे में सोचा है। :-)

+0

प्रोग्रामिंग समाधान नहीं है, लेकिन यह निश्चित रूप से काम करेगा :) – jop

0

प्रोग्रामेटिक रूप से unmounting a USB drive किया जा सकता है, हालांकि, मुझे नहीं पता कि कोड के माध्यम से रिमाउंटिंग किया जा सकता है या नहीं।

0

में Eject USB disks using C# (The Code Project) इस के लिए देखो:

CM_Request_Device_Eject समारोह

यह SetupApi समारोह है कि एक डिवाइस (कि निकली जा सकती है, किसी भी डिवाइस) ejects है। यह इनपुट के रूप में एक डिवाइस उदाहरण हैंडल (या devInst) लेता है ...

+1

क्या कोई डिवाइस "... वर्चुअल कॉम पोर्ट के रूप में मास्कराइडिंग" कर सकता है। बाहर निकाला जा सकता है? –

1

Greg Hewgill के रूप में कहा, मुझे नहीं लगता कि यह संभव है है।

पूरे यूएसबी स्टार्टअप की शुरूआत यूएसबी दास (आपके मामले में आपके डिवाइस में) द्वारा शुरू की जाती है। यूएसबी होस्ट (पीसी) डिवाइस को एक संदेश भेज सकता है ताकि उसे बंद करने के लिए कहा जा सके, लेकिन एक बार यह हो गया कि यह फिर से बैक अप लेने के लिए डिवाइस पर है। मेजबान इसे मजबूर नहीं कर सकता है।

मामलों को और भी खराब बनाने के लिए आपको संभवत: यह पता चल जाएगा कि यूएसबी डिवाइस शुरू होने के लिए प्लग डालने वाले प्लग का पता लगा रहा है (पावर लाइनों पर यूएसबी वोल्टेज का पता लगाकर)। यह विशेष रूप से बस संचालित उपकरणों के बारे में सच है।


ऐसा लगता है कि आपकी स्थिति से भिन्नताएं हैं और यूएसबी ड्राइव को अनमाउंट/रीमाउंट करने का प्रयास करने की स्थिति है। जब यूएसबी ड्राइव अनमाउंट किया जाता है तो कोई कारण नहीं है कि यह पीसी पर उल्लिखित नहीं रह सकता है। आप वास्तव में यूएसबी ड्राइव को रीसेट नहीं कर रहे हैं, बस इसे फाइल सिस्टम निष्क्रिय कर रहे हैं।

1

मैंने इसे स्वचालित परीक्षणों के लिए देखा है। जब हम बहुत अधिक शक्ति खींचते हैं तो डिवाइसों को डिस्कनेक्ट करने के लिए यूएसबी हब्स की क्षमता का सबसे अच्छा समाधान लगता है। एक यूएसबी pserspective से, ऐसा लगता है कि यूएसबी होस्ट ऐसा करने के लिए एक केंद्र निर्देश दे सकता है। 12 उपकरणों के साथ, आपके पास हब्स होंगे, इसलिए मैं उस पथ की जांच करने का सुझाव दूंगा।

0

हमने प्रोग्राम करने योग्य डिस्कनेक्ट यूएसबी उपकरणों के लिए this का उपयोग किया।

+0

अस्वीकरण: यह एक प्रोग्रामेटिक समाधान नहीं है। –

2

विचार: डिवाइस मैनेजर के तहत, आप अपने कंप्यूटर आइकन (डिवाइस पेड़ के शीर्ष) और "परिवर्तनों के लिए स्कैन करें" पर राइट-क्लिक कर सकते हैं।मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि यदि आप एक यूएसबी डिवाइस (सॉफ़्टवेयर "अनप्लग" समकक्ष "निष्कासित करते हैं, तो हार्डवेयर परिवर्तनों के लिए स्कैन करें, यह बैक अप दिखाएगा, भले ही यह वास्तव में बंदरगाह को कभी नहीं छोड़े।

यदि मैं इसके बारे में सही हूं, तो आप नियंत्रण कक्ष -> व्यवस्थापकीय उपकरण -> डिवाइस प्रबंधक खोलने और संदर्भ-मेनू आइटम चलाने के अनुकरण के लिए Microsoft.Win32.Shell क्लास का उपयोग करने में सक्षम हो सकते हैं। यह एक शॉट के लायक है, वैसे भी।

0

डिवाइस स्वयं ऐसा करने में सक्षम हो सकता है (यानी, यूएसबी डिस्कनेक्ट/रीकनेक्ट अनुक्रम करें)।

क्या आपने डिवाइस निर्माता से संपर्क किया है, या यदि आप निर्माता हैं, तो ईई ने इसे डिज़ाइन किया है?

मुझे ऐसा करना पड़ा जब मैंने एक यूएसबी एम्बेडेड डिवाइस डिज़ाइन किया - प्रोग्रामिंग यूएसबी के माध्यम से पूरा किया जा सकता था, लेकिन डिवाइस को प्रक्रिया को पूरा करने के लिए कई बिंदुओं पर डिस्कनेक्ट और पुनः कनेक्ट करने में सक्षम होना था।

इसके अलावा डिवाइस मैनेजर में यूएसबी होस्ट डिवाइस को अक्षम करने की ब्रूट फोर्स विधि है (मुझे लगता है कि यह सॉफ़्टवेयर में किया जा सकता है) और फिर इसे पुनः सक्षम कर रहा है।

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

-Adam

8

क्या Devcon.exe का उपयोग कर "को दूर करने के लिए" और फिर "रीस्कैन" के बारे में?

डीआर

+1

दूसरा यह, devcon विंडोज चालक किट का एक हिस्सा है और स्रोत भी प्रदान किया जाता है। – djp

+0

[devcon] (https://msdn.microsoft.com/en-us/library/windows/hardware/ff544707 (v = vs.85) .aspx) को व्यवस्थापकीय विशेषाधिकारों की आवश्यकता होती है। –

1

मुझे कुछ समय पहले अपने कार कंप्यूटर प्रोजेक्ट के लिए ऐसा करना था। टचस्क्रीन ड्राइवरों को हाइबरनेट में जाना पसंद नहीं था और कंप्यूटर को हाइबरनेट से वापस आने पर दोबारा लगाने की आवश्यकता थी। जिस तरह से मैंने इसे हल करने का प्रयास किया, वह Devcon.exe का उपयोग डिजिटल रेसर जैसा सुझाया गया था। चाल हालांकि, नियंत्रक पर निकालें/rescan काम नहीं किया था। मुझे डिवाइस से एक हब अपस्ट्रीम पर निकालना/rescan करना था (जो बाद में सभी संलग्न उपकरणों को डिस्कनेक्ट किया गया था)।

1

यहाँ मार्गदर्शन पर कुछ हाथ है:

http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459

यह और अधिक कट्टर है:

http://support.microsoft.com/kb/311272

मैं कहना चाहता हूँ कि devcon.exe का उपयोग कर कुछ समस्याओं का मेरा हालांकि समाधान हो सकता है, नहीं । मान लीजिए कि आप यूएसबी पोर्ट्स के सरणी के साथ एक बॉक्स बना सकते हैं, जहां एमसीयू द्वारा नियंत्रित एफईटी के साथ पावर लाइन बाधित होती है। एमसीयू को आरएस -223 जैसे कुछ बुनियादी और भरोसेमंद बात करनी चाहिए। एक Arduino बोर्ड हो सकता है जो डरावना हार्डवेयर काम को सरल बनाता है।

3

आप C# Hardware Helper Lib का उपयोग कर सकते हैं और ResetDevice function जोड़ सकते हैं।

public bool ResetDevice(IntPtr hDevInfo, IntPtr devInfoData) 
// Need to add 
// public const int DICS_PROPCHANGE = ((0x00000003)); 
// at the public class Native under //PARMS 
int szOfPcp; 
IntPtr ptrToPcp; 
int szDevInfoData; 
IntPtr ptrToDevInfoData; 

Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS(); 
pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER)); 
pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE; 
pcp.StateChange = Native.DICS_PROPCHANGE; // for reset 
pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC; 
pcp.HwProfile = 0; 

szOfPcp = Marshal.SizeOf(pcp); 
ptrToPcp = Marshal.AllocHGlobal(szOfPcp); 
Marshal.StructureToPtr(pcp, ptrToPcp, true); 
szDevInfoData = Marshal.SizeOf(devInfoData); 
ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); 
Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true); 

bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS))); 
bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); 

if (rslt1 && rstl2) 
{ 
    return true; 
} 
return false; 
} 
+0

दुर्भाग्य से यह केवल तभी काम करता है जब डिवाइस व्यस्त नहीं है। अन्यथा यह एक रिबूट के लिए पूछता है। –