2010-07-06 20 views
9

मुझे SerialPort.Open();सीरियलपोर्ट पोर्ट.ओपेन "पोर्ट 'COM2' मौजूद नहीं है।"

के साथ एक बड़ी समस्या है, मैं एक यूएसबी वर्चुअल कॉम पोर्ट (सीडीसी) के साथ संचार कर रहा हूं, और इसे COM2 के रूप में सूचीबद्ध किया गया है।

यह टेराटर्म/हाइपर टर्मिनल ईक्ट में ठीक काम करता है। लेकिन जब मैं सी # में बंदरगाह खोलने की कोशिश करता हूं, तो यह मुझे अपवाद The port 'COM2' does not exist देता है।

मुझे SerialPort.GetPortNames() फ़ंक्शन का उपयोग कर पोर्ट नाम मिलता है, और जब मैं डीबग करता हूं तो यह ठीक लगता है।

मैंने हार्डकोड नाम को सेट करने का प्रयास किया है, लेकिन बिना किसी किस्मत के।

अब वास्तव में अजीब चीज है, यह कुछ पीसी पर ठीक काम करता है, और अन्य पीसी पर विफल रहता है। कुछ पीसी पर यह हर समय असफल रहता है, और दूसरों पर यह 10% समय में विफल रहता है।

और भी अजीब यह यूएसबी पोर्ट पर निर्भर करता है, कुछ बंदरगाह ठीक काम करते हैं, अन्य असफल होते हैं (उसी पीसी पर!)।

क्या कोई मेरी मदद कर सकता है?

+0

चालक परेशानी, वे अक्सर भयानक होते हैं। निर्माता से अपडेट की तलाश करें, अगर आप इसे ठीक नहीं कर सकते हैं तो डिवाइस को जंक करें। –

+0

मुझे एक समाधान मिला। एक सुंदर नहीं है, लेकिन कुछ पीसी पर यूएसबी चालक बस अच्छा नहीं है। वैसे मैं प्रत्येक प्रयास के बीच 500 एमएमएस देरी के साथ, पोर्ट को दस बार खोलने की कोशिश कर रहा हूं। मुझे लगता है कि छेद की समस्या getPortNames() फ़ंक्शन के बीच विलंबता के रूप में उपलब्ध है, और बंदरगाह को खोलने के लिए वास्तव में संभव था। – JakobJ

+0

मैन, वह भाग्यशाली है। हालांकि मैं तुम्हारा दर्द जानता हूँ। मेरा होम पीसी एक मॉनीटर सेटअप का उपयोग करता है जो यूएसबी कनेक्शन पर निर्भर करता है। जब भी सिस्टम शक्ति खो देता है तो मुझे अपने घुटनों पर 10 मिनट बिताना पड़ता है जब तक यूएसबी कनेक्शन को तब तक चालू नहीं किया जाता है जब तक यह नहीं लगता है और मेरे पास वीडियो हो सकता है। यूएसबी काम की जरूरत है। –

उत्तर

6

मैंने वर्चुअल सीरियल पोर्ट्स के साथ पहले काम किया है। अक्सर विंडोज़ एपीआई कॉल के लिए "COMX:" के रूप में वे पहुंच योग्य नहीं होते हैं, और आपको उन्हें पूरी तरह से निर्दिष्ट करना होगा। यह मामला यहां हो सकता है। सीरियल डिवाइस के लिए विंडोज डिवाइस नेमस्पेस पथ का उपयोग करने का प्रयास करें। उदाहरण के लिए: "\\। \ COM2"

डीबगिंग के लिए उपयोगी एक और चीज जो मैंने दी गई सीरियल पोर्ट पर एक हाइपरटेर खोल रही है।

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

+1

com0com में उचित दस्तावेज़ीकरण और उपयोग-उदाहरण भी हैं! यदि आप किसी प्रकार का सीरियल परीक्षण कार्य करते हैं तो यह देखने के लिए उत्कृष्ट खोज और अच्छी तरह से मूल्यवान है! – omglolbah

+0

मैं एक आरडीपी सत्र (सर्वर 2008 आर 2 पर) से अपने स्थानीय COM4 से कनेक्ट करने का प्रयास कर रहा था। आपके सुझाव ने मुझे यह जानने में मदद की कि बंदरगाह वास्तव में \\ tsclient \\ COM4 है। मुझे अभी भी उस नाम का उपयोग करने के लिए .NET को चालना पड़ा था, लेकिन अंत में मुझे यह मिला। – tgolisch

3

यह त्रुटि तब हो सकती है जब ड्राइवर "COM2" के लिए एक अप्रत्याशित "फ़ाइल प्रकार" लौटाता है।

पी/Invoking GetFileType का प्रयास करें और मुझे विश्वास है कि आप पैटर्न देखेंगे। यह FILE_TYPE_CHAR या FILE_TYPE_UNKNOWN होना चाहिए या अन्य SerialPort उस अपवाद को फेंक देगा।

class Program 
{ 
    static void Main(string[] args) 
    { 
    string portName = @"COM2"; 
    IntPtr handle = CreateFile(portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero); 
    if (handle == (IntPtr)(-1)) 
    { 
     Console.WriteLine("Could not open " + portName + ": " + new Win32Exception().Message); 
     Console.ReadKey(); 
     return; 
    } 

    FileType type = GetFileType(handle); 
    Console.WriteLine("File " + portName + " reports its type as: " + type); 

    Console.ReadKey(); 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    public static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); 

    [DllImport("kernel32.dll")] 
    static extern FileType GetFileType(IntPtr hFile); 

    enum FileType : uint 
    { 
    UNKNOWN = 0x0000, 
    DISK = 0x0001, 
    CHAR = 0x0002, 
    PIPE = 0x0003, 
    REMOTE = 0x8000, 
    } 
} 

एमएसडीएन मंचों पर this thread भी देखें।

+0

धन्यवाद! मैंने आपके कोड की कोशिश की, लेकिन फ़ाइल प्रकार और खुली समस्या के बीच एक पैटर्न प्रतीत नहीं हुआ। – JakobJ

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