दिलचस्प पोस्ट
SQLSERVER में सूचीगैग UIButton: हिट क्षेत्र को डिफ़ॉल्ट हिट क्षेत्र से बड़ा करना ओ एक छवि प्रदर्शित LINQ के लिए जावा बराबर क्या है? मैन्युअल रूप से एक एन्कोडिंग को निर्दिष्ट किए बिना मैं सी # में स्ट्रिंग्स का संगत बाइट प्रतिनिधित्व कैसे प्राप्त करूं? व्युत्पन्न क्लास फ़ंक्शन से पैरेंट क्लास फंक्शन कैसे कॉल करें? पता लगाया जा रहा है कि एक एप्लीकेशन स्थापित है या नहीं? अपेक्षित यदि कंडीशनल वैधीकरण विशेषता java.net.UnknownHostException: सर्वर के लिए अमान्य होस्टनाम: स्थानीय बाईं तरफ पाठ-ओवरफ्लो एलीप्सिस कैसे "यह" कीवर्ड फ़ंक्शन के भीतर काम करता है? प्रत्येक 'लूप' काम के लिए जावा कैसे करता है? क्या स्प्रिंग @ ट्रान्सैसिअल विशेषता एक निजी विधि पर काम करती है? गूगल मानचित्र एपीआई वी 3 – सटीक एक ही जगह पर कई मार्कर UITableViewCell की पृष्ठभूमि का रंग कैसे अनुकूलित करें?

एक अनप्लग्ड वर्चुअल सीरियल पोर्ट जारी करना

मुझे एक यूएसबी बारकोड स्कैनर के साथ थोड़ी सी समस्या है मैं "सीरियल पोर्ट" वर्ग के साथ स्कैनर का उपयोग कर रहा हूं:

this._barcodeScanner = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One) { Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500 }; this._barcodeScanner.Open(); this._barcodeScanner.DataReceived += BarcodeScannerCallback; 

अगर मैं "सीरियल पोर्ट" वर्ग के माध्यम से खोला गया यूएसबी डिवाइस को अनप्लग करता हूं, तो मैं सॉफ्टवेयर को ठीक से नहीं रोक सकता और आभासी बंदरगाह सभी अनंत काल तक खुला रहता है या जब तक मैं पूरे कंप्यूटर को रिबूट नहीं करता।

तो मेरा प्रश्न यह है, क्या मुझे डिवाइस को सी # कोड के द्वारा अनप्लग करने के बाद वर्चुअल पोर्ट बंद करने का कोई तरीका है?

अस्सलाम वालेकुम

[1 संपादित करें]

ठीक है, कुछ और कोड:

इस तरह से मैं हर 10 सेकंड की जांच कर रहा हूं अगर डिवाइस में प्लग किया गया है:

  private bool CheckUsbDeviceAvailability() { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName WHERE PortName = '" + this.PortName + "'"); if (searcher.Get().Count > 0) return true; return false; } 

कॉलबैक-सीरियल पोर्ट की इवेंट:

 void BarcodeScannerCallback(object sender, SerialDataReceivedEventArgs e) { Thread.Sleep(500); string data = this._barcodeScanner.ReadExisting().Replace(Convert.ToChar(2), Convert.ToChar(32)).Trim(); if (data.StartsWith("AX")) { string[] arrData = data.Split('\n'); this._barcodeScanner.StopAvailabilityThread(); Barcode code = new Barcode(arrData[0].Replace("\r", "")); if (CheckIfBarcodeExists(code)) this.UpdateBarcodeNode(code); else this.CreateBarcodeNode(code); BarcodeScannerCallbackEvent(sender, e, code); this._barcodeScanner.StartAvailabilityThread(); } this._barcodeScanner.ComDevicePluggedIn = ScannerDevice.ComAvailabilityState.Available; } 

यदि यह अब जवाब नहीं देता है तो यह "DeviceNotAvailableEvent ()" को आग देगा:

  void BarcodeScannerDeviceNotAvailableEvent() { this._barcodeScanner.Close(); this._barcodeScanner.Dispose(); } 

मैंने "सीरियल पोर्ट" वर्ग की डिस्पोज इवेंट को ओवरराइड कर दिया है ताकि यह थ्रेड को रद्द करने जा रहा हो:

 protected override void Dispose(bool isDisposing) { if (isDisposing) { this._deviceAvailableThread.Abort(); } base.Dispose(isDisposing); } 

वेब के समाधान से एकत्रित समाधान "एक अनप्लग्ड वर्चुअल सीरियल पोर्ट जारी करना"

कंप्यूटिंग के पत्थर युग से सीरियल पोर्ट्स की तारीख। यही वह जगह है जहां आपने अपने फोरट्रान कार्यक्रम में टाइप करना शुरू करने के लिए अपने एएसआर -33 टेलिटेप में प्लग किया था। विद्युत अंतरफलक बहुत सरल है तो अपने स्वयं के कोड से एक सीरियल पोर्ट का उपयोग करने के लिए Windows API है व्यावहारिक रूप से किसी भी रनटाइम पर्यावरण उन्हें समर्थन करता है

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

यह लचीलेपन कीमत पर आता है, हालांकि, एक यूएसबी डिवाइस को हमेशा उपयोग करने योग्य बनाने के लिए डिवाइस ड्राइवर की आवश्यकता होती है। डिवाइस ड्राइवर समान नहीं बनाए जाते हैं विभिन्न ड्राइवरों को डिवाइस से बात करने के लिए अलग-अलग तरीके की आवश्यकता होती है। आमतौर पर DeviceIoControl () या Read / WriteFile () के माध्यम से किया जाता है लेकिन वे बहुत अपारदर्शी API फ़ंक्शन हैं। यूएसबी के शुरुआती दिनों में, डिवाइस निर्माताओं एक DLL की आपूर्ति करेगा जो कार्यान्वयन विवरण छिपाने के लिए एक समृद्ध एपीआई प्रदान करता है।

यह इतनी अच्छी तरह से काम नहीं करता, निर्माता अच्छे एपीआई लिखने में बहुत अच्छे नहीं हैं और उन्हें यकीन है कि उन्हें समर्थन देना पसंद नहीं है। इसलिए एक अच्छा समाधान एक मानक एपीआई का समर्थन करना होगा, जो किसी भी मशीन पर उपलब्ध है, किसी भी रनटाइम द्वारा समर्थित, दस्तावेज और किसी और के द्वारा बनाए रखा। सीरियल पोर्ट एपीआई की तरह

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

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

यह डिवाइस का उपयोग करने वाले किसी भी उपयोगकर्ता मोड कोड पर कहर का खेलता है। आम तौर पर यह माना जाता है कि यह एक वास्तविक सीरियल पोर्ट है और वास्तविक सीरियल पोर्ट अचानक गायब नहीं होते हैं। कम से कम एक उज्ज्वल नीले चिंगारी को चित्रित किए बिना। क्या गलत हो गया है बहुत अप्रत्याशित है क्योंकि यह इस बात पर निर्भर करता है कि चालक किसी डिवाइस पर अनुरोधों का जवाब कैसे देता है जो अब नहीं है। SerialPort द्वारा शुरू किया गया एक कार्यकर्ता धागा में एक अपूर्व अपवाद एक आम दुर्घटना थी। आपके चालक की तरह लगता है कि वह वास्तव में गलत हो जाता है, यह MJ_CLOSE ड्राइवर अनुरोध पर एक त्रुटि रिटर्न कोड उत्पन्न करता है। कौन सी तरह की तार्किक चीज एक ड्राइवर के लिए करती है, क्योंकि सभी उपकरण अब नहीं है, लेकिन आपके अंत से काफी निराश नहीं हो सकता है। आपके पास एक हैंडल है और आप इसे बंद नहीं कर सकते। यह कोई चप्पू के साथ एक क्रीक है

दुर्घटना को कम करने का प्रयास करने के लिए सीरियल पोर्ट कक्षाओं के लिए प्रत्येक प्रमुख रिलीज .नेट का एक छोटा सा पैच था। लेकिन माइक्रोसॉफ्ट एक सीमित मात्रा में है, सभी त्रुटियों को पकड़ने और वे ऐसा नहीं होने का नाटक करते हैं जो आखिरकार क्लास की ओर जाता है जो अब अच्छे चिकित्सक के साथ-साथ अच्छा चालक भी नहीं प्रदान करता है।

तो व्यावहारिक दृष्टिकोण हैं:

  • हमेशा विंडोज में हार्डवेयर सुरक्षित रूप से ट्रे आइकन को निकालें
  • .NET के नवीनतम संस्करण का उपयोग करें
  • विक्रेता से संपर्क करें और एक ड्राइवर अपडेट के लिए पूछें
  • खाई वाले विक्रेताओं जो घटिया ड्राइवरों की आपूर्ति करते हैं
  • अपने उपयोगकर्ताओं को बताएं कि, केवल इसलिए कि आप केवल एक USB डिवाइस के साथ कर सकते हैं, जिससे कि इसे अनप्लग करने से कोई भी समस्याएं हल नहीं होती हैं
  • अपने यूआई में बंदरगाह को आसान और सुलभ बनाना बंद करें
  • बंदरगाह में USB कनेक्टर को गोंद करें ताकि इसे हटाया नहीं जा सके

5 वां बुलेट भी है जो प्रोग्रामर को परेशानी में ले जाता है। सीरियल पोर्ट कोड लिखना आसान नहीं है, यह भारी असिंक्रोनस है और डेटा रिसेव्ड इवेंट को चलाने वाला थ्रेडपुल धागा से निपटना मुश्किल है। जब आप सॉफ्टवेयर की समस्या का निदान नहीं कर सकते हैं तो आप हार्डवेयर को दोषी मानते हैं। बहुत कम है आप हार्डवेयर के साथ कर सकते हैं लेकिन इसे अनप्लग कर सकते हैं बुरा विचार। अब आपके पास दो समस्याएं हैं

यह समस्या, नेट 2, 3, 3.5 में मौजूद है, आप ढांचा 4 का उपयोग कर सकते हैं (समस्या 4 नेट में मौजूद नहीं है)