2009-07-22 12 views
12

क्या सभी उपलब्ध बॉड दरों को जानने का कोई तरीका है कि एक विशेष सिस्टम सी # के माध्यम से समर्थन करता है? यह डिवाइस मैनेजर -> पोर्ट्स के माध्यम से उपलब्ध है लेकिन मैं इन प्रोग्रामिक रूप से सूचीबद्ध करना चाहता हूं।सी # (सीरियलपोर्ट श्रेणी) में सभी उपलब्ध Baudrates को प्रोग्रामेटिक रूप से कैसे ढूंढें

धन्यवाद।

उत्तर

12

मुझे ऐसा करने के कुछ तरीके मिले हैं। निम्नलिखित दो दस्तावेजों एक प्रारंभिक बिंदु थीं

सुराग पहला दस्तावेज

क्या बॉड दरों का निर्धारण करने के लिए सबसे आसान तरीका से निम्नलिखित पैराग्राफ में है एक विशेष सीरियल पोर्ट पर उपलब्ध हैं GetCommProperties() एप्लिकेशन प्रोग्रामिंग इंटरफेस (एपीआई) को कॉल करना और COMMPROP.dwSettableBau की जांच करना है डी सीटियल बंदरगाह पर बैड दरों का समर्थन करने के लिए निर्धारित करने के लिए बिटमैस्क।

इस स्तर पर

वहाँ सी # में ऐसा करने के दो विकल्प हैं:

1.0 उपयोग इंटरॉप (पी/आह्वान) इस प्रकार है:

निम्नलिखित डेटा संरचना को परिभाषित करें

[StructLayout(LayoutKind.Sequential)] 
struct COMMPROP 
{ 
    short wPacketLength; 
    short wPacketVersion; 
    int dwServiceMask; 
    int dwReserved1; 
    int dwMaxTxQueue; 
    int dwMaxRxQueue; 
    int dwMaxBaud; 
    int dwProvSubType; 
    int dwProvCapabilities; 
    int dwSettableParams; 
    int dwSettableBaud; 
    short wSettableData; 
    short wSettableStopParity; 
    int dwCurrentTxQueue; 
    int dwCurrentRxQueue; 
    int dwProvSpec1; 
    int dwProvSpec2; 
    string wcProvChar; 
} 

फिर निम्नलिखित हस्ताक्षर परिभाषित करें

[DllImport("kernel32.dll")] 
static extern bool GetCommProperties(IntPtr hFile, ref COMMPROP lpCommProp); 
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, 
      int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, 
      int dwFlagsAndAttributes, IntPtr hTemplateFile); 

अब बनाने के निम्नलिखित कॉल (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx को देखें)

COMMPROP _commProp = new COMMPROP(); 
    IntPtr hFile = CreateFile(@"\\.\" + portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero); 
    GetCommProperties(hFile, ref commProp); 

PORTNAME कहाँ कॉम की तरह कुछ है ?? (COM1, COM2, आदि)। commProp.dwSettableBaud में अब वांछित जानकारी होनी चाहिए।

2.0 का प्रयोग करें सी # प्रतिबिंब

प्रतिबिंब के रूप में निम्नानुसार serialport BaseStream उपयोग करने के लिए आवश्यक डेटा इस्तेमाल किया जा सकता है और यहां से:

_port = new SerialPort(portName); 
    _port.Open(); 
    object p = _port.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_port.BaseStream); 
    Int32 bv = (Int32)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p); 

ध्यान दें कि बंदरगाह के ऊपर दोनों तरीकों में (रों) इस डेटा को प्राप्त करने के लिए कम से कम एक बार खोला जाना है।


+0

मुझे लगता है कि जब आप CloseHandle (hFile) –

+0

@ HiteshP को कॉल करके इसका उपयोग कर रहे हैं, तो आपको हैंडल को बंद करने की आवश्यकता है: विंडोज सीई का उपयोग करने वाले किसी भी व्यक्ति को निम्नलिखित दो बदलाव करें: (1) "स्ट्रिंग wcProvChar" को "char wcProvChar" में बदलें दोनों पी/invokes के लिए coredll.dll "के बदले" kernel32.dll "" COMMPROP संरचना में और (2) का उपयोग करें "। नोट: बाद में जब आप Jakub इंगित करते हैं तो आपको COM पोर्ट को फ़ाइल पोर्ट को बंद करना चाहिए। – AlainD

0

मुझे नहीं लगता कि आप कर सकते हैं।

मुझे हाल ही में यह समस्या थी, और मैं जिस बॉड दरों का उपयोग करना चाहता था, उसे कड़ी मेहनत कर रहा था।

एमएसडीएन बस कहता है, "बॉड दर उपयोगकर्ता के सीरियल ड्राइवर द्वारा समर्थित होना चाहिए"।

+0

मैं भी एक ही बात पढ़ें। हालांकि, मुझे संदेह है कि डिवाइस मैनेजर इन्हें प्रदर्शित करने के बाद ऐसा करने का एक तरीका है। – HiteshP

+0

मैं इस कठिन कोडित किया जा सकता है भी मैं, दोनों अलग चिपसेट, और बॉड दरों की सूची इस कंप्यूटर में विभिन्न धारावाहिक ताश के पत्तों की एक जोड़ी पर शक समान है। बेशक, यह मामला हो सकता है कि वे दोनों एक ही बॉड दरों का समर्थन करने के लिए बस होते हैं। इस Win32 संरचना पर देखो , यह भी मुश्किल कोडित है मान। – Bryan

+0

क्षमा करें, मैंने लिंक http://msdn.microsoft.com/en-us/library/aa363214(VS.85).aspx – Bryan

0
dwSettableBaud gives 268894207 int (0x1006ffff) 
while dwMaxBaud gives 268435456 int (0x10000000) 

जाहिर है, यह मुझे मदद नहीं करता है।

using System; 
using System.Collections.Generic; 
using System.IO.Ports; 
using System.Linq; 


    public static readonly List<string> SupportedBaudRates = new List<string> 
{ 
    "300", 
    "600", 
    "1200", 
    "2400", 
    "4800", 
    "9600", 
    "19200", 
    "38400", 
    "57600", 
    "115200", 
    "230400", 
    "460800", 
    "921600" 
}; 

    public static int MaxBaudRate(string portName) 
    { 
     var maxBaudRate = 0; 
     try 
     { 
      //SupportedBaudRates has the commonly used baudRate rates in it 
      //flavor to taste 
      foreach (var baudRate in ConstantsType.SupportedBaudRates) 
      { 
       var intBaud = Convert.ToInt32(baudRate); 
       using (var port = new SerialPort(portName)) 
       { 
        port.BaudRate = intBaud; 
        port.Open(); 
       } 
       maxBaudRate = intBaud; 
      } 
     } 
     catch 
     { 
      //ignored - traps exception generated by 
      //baudRate rate not supported 
     } 

     return maxBaudRate; 
    } 

बॉड दरों तार में हैं क्योंकि वे एक कॉम्बो बॉक्स के लिए किस्मत में हैं: तो यह है कि मैं क्या वर्तमान में पर भरोसा कर रहा हूँ।

private void CommPorts_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     var combo = sender as ComboBox; 
     if (combo != null) 
     { 
      var port = combo.Items[combo.SelectedIndex].ToString(); 
      var maxBaud = AsyncSerialPortType.MaxBaudRate(port); 
      var baudRates = ConstantsType.SupportedBaudRates; 
      var f = (SerialPortOpenFormType)(combo.Parent); 
      f.Baud.Items.Clear(); 
      f.Baud.Items.AddRange(baudRates.Where(baud => Convert.ToInt32(baud) <= maxBaud).ToArray()); 
     } 
    } 

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