मुझे ऐसा करने के कुछ तरीके मिले हैं। निम्नलिखित दो दस्तावेजों एक प्रारंभिक बिंदु थीं
सुराग पहला दस्तावेज
क्या बॉड दरों का निर्धारण करने के लिए सबसे आसान तरीका से निम्नलिखित पैराग्राफ में है एक विशेष सीरियल पोर्ट पर उपलब्ध हैं 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);
ध्यान दें कि बंदरगाह के ऊपर दोनों तरीकों में (रों) इस डेटा को प्राप्त करने के लिए कम से कम एक बार खोला जाना है।
मुझे लगता है कि जब आप CloseHandle (hFile) –
@ HiteshP को कॉल करके इसका उपयोग कर रहे हैं, तो आपको हैंडल को बंद करने की आवश्यकता है: विंडोज सीई का उपयोग करने वाले किसी भी व्यक्ति को निम्नलिखित दो बदलाव करें: (1) "स्ट्रिंग wcProvChar" को "char wcProvChar" में बदलें दोनों पी/invokes के लिए coredll.dll "के बदले" kernel32.dll "" COMMPROP संरचना में और (2) का उपयोग करें "। नोट: बाद में जब आप Jakub इंगित करते हैं तो आपको COM पोर्ट को फ़ाइल पोर्ट को बंद करना चाहिए। – AlainD