C # الاختيار إذا كان COM (المسلسل) المنفذ مفتوح بالفعل

StackOverflow https://stackoverflow.com/questions/195483

  •  10-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة لفحص برمجيا إذا تم بالفعل فتح / تستخدم منفذ COM المسلسل؟

وعادة أود أن استخدام:

try
{
    // open port
}
catch (Exception ex)
{
    // handle the exception
}

ومع ذلك، أود أن تحقق برمجيا حتى أتمكن من محاولة لاستخدام منفذ COM آخر أو بعض من هذا القبيل.

هل كانت مفيدة؟

المحلول

وأنا في حاجة إلى شيء مماثل منذ بعض الوقت، للبحث عن الجهاز.

وحصلت على قائمة من منافذ COM المتوفرة ثم كرر ببساطة عليها، إذا لم بطرح استثناء حاولت التواصل مع الجهاز. خشنة بعض الشيء ولكن العمل.

var portNames = SerialPort.GetPortNames();

foreach(var port in portNames) {
    //Try for every portName and break on the first working
}

نصائح أخرى

وهذه هي الطريقة التي فعلت ذلك:

      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);

وبعد ذلك في وقت لاحق

        int dwFlagsAndAttributes = 0x40000000;

        var portName = "COM5";

        var isValid = SerialPort.GetPortNames().Any(x => string.Compare(x, portName, true) == 0);
        if (!isValid)
            throw new System.IO.IOException(string.Format("{0} port was not found", portName));

        //Borrowed from Microsoft's Serial Port Open Method :)
        SafeFileHandle hFile = CreateFile(@"\\.\" + portName, -1073741824, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero);
        if (hFile.IsInvalid)
            throw new System.IO.IOException(string.Format("{0} port is already open", portName));

        hFile.Close();


        using (var serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One))
        {
            serialPort.Open();
        }

ويمكنك محاولة البرمجية التالية للتحقق ما إذا كان المنفذ مفتوح بالفعل أم لا. أنا assumming كنت لا تعرف specificaly التي المنفذ الذي تريد التحقق منه.

foreach (var portName in Serial.GetPortNames()
{
  SerialPort port = new SerialPort(portName);
  if (port.IsOpen){
    /** do something **/
  }
  else {
    /** do something **/
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top