كيف يمكنني الحصول على الاسم "المألوف" للمنفذ التسلسلي في Mono والاحتفاظ به عبر النظام الأساسي

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

سؤال

لقد طرحت هذا السؤال:
المنفذ التسلسلي (rs232) في Mono لمنصات متعددة

وهذا مرتبط:
كيف يمكنني الحصول على الاسم المألوف لمنفذ COM في نظام التشغيل Windows؟

لكنني أريد أن أكون قادرًا على الحصول على الاسم "المألوف" على Windows - وربما أيضًا على Linux/mac إذا كان هناك شيء من هذا القبيل.

هل هناك أي طريقة عبر المنصات للقيام بذلك، أم أنني لم يحالفني الحظ؟

إليك ما أفعله في تطبيقي الحالي - وهو يعمل بشكل رائع مع الإصدار C++ الأصلي win32.

http://www.naughter.com/enumser.html

على أية حال، لا يبدو أنه حل جيد للتوزيع عبر الأنظمة الأساسية.هل يوجد لدى احد أي اقتراحات؟

تعديل - نظرًا لأن الأشخاص يواجهون صعوبة في فهم ما أطلبه:على سبيل المثال - COM9 ليس اسمًا مألوفًا.أريد شيئًا يقول "COM9 - ​​موصل USB" أو شيء من هذا القبيل.هذا ممكن مع الرابط أعلاه في Win32.إنه أمر سيئ ومخترق، ولكن في كثير من الأحيان ليس لدى المستخدمين النهائيين أي فكرة عن منفذ COM الذي يحتاجون إلى فتحه في برنامجي ما لم يكن هناك اسم مفيد - أكثر فائدة من "COMn".

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

المحلول

AFAIK لا يوجد اسم "مألوف" لأجهزة COMM في نظام التشغيل Linux.ما أقترح عليك فعله هو استخدام /dev/ttyS# كاسم جهازك في بيئة Linux وإدراجها كـ COMM# في windows.

سيفهم مستخدمو Linux المصطلحات، لذا لا داعي للقلق.

نصائح أخرى

فكر في النظر إلى SerialPort.GetPortNames() طريقة ثابتة.إنه متوفر في .NET 2.0، ويبدو أنه تم تنفيذه في Mono أيضًا.وفقًا لـ http://www.go-mono.com/docs/>صفحة المستندات الأحادية، يوجد GetPortNames على كائن المنفذ التسلسلي Mono، لذا سأجربه.

إذا تم تنفيذه، فيجب أن يُرجع لك مجموعة من السلاسل C# التي تحتوي على أسماء المنافذ المتوفرة على جهاز الكمبيوتر الخاص بك.يجب أن تكون هذه منطقية لأي نظام تشغيل أساسي لديك.على سبيل المثال، في نظام التشغيل Windows، سيتم إرجاع COM1، COM2، COM4، وما إلى ذلك.يجب أن تقوم بإرجاع السلسلة المطلوبة لـ PortName ملكية.

تحديث:

إلقاء نظرة على منشور من القائمة البريدية لـ mono-dev يبدو أنه يعمل ضمن بيئات *nix.

جرب الاستعلام التالي في WMI:

"اختر اسمًا من Win32_PnPEntity" وابحث عن الكائنات التي تحتوي على "COM"، على سبيل المثال، لدي جهاز USB-Serial Converter مثبت على جهاز الكمبيوتر الخاص بي:

USB60FPW محول USB التسلسلي (COM6)

أنت بحاجة إلى النظر في القيام بـ WMI.لم أتمكن من تشغيل هذا بنفسي، ولكن إذا قمت بالدمج هذا الإطار الأساسي كيفية استرداد كائن WMI باستخدام هذه الوثائق التابع Win32_SerialPort الفصل، أعتقد أنه يمكنك حل شيء ما.

في الأساس، تريد الحصول على مجموعة من كل Win32_SerialPorts على النظام، ثم قم بالتكرار من خلالهم.قد تحتاج إلى "التسمية التوضيحية" أو "الوصف" أو ربما "الاسم" فقط.أفضل نصيحتي هي تعيين نقطة توقف والتحقق من خصائص الكائن في وضع التصحيح حتى تتمكن من معرفة ما يتم ملؤه بالضبط.

شفرة:

    public static ArrayList GetComFriendlyNames()
    {
        ArrayList names = new ArrayList();
        try
        {
            ManagementObjectSearcher searcher =
              new ManagementObjectSearcher("root\\WMI",
              "SELECT InstanceName, PortName FROM MSSerial_PortName");

            foreach (ManagementObject port in searcher.Get())
            {
                names.Add(port["PortName"] + " - " + port["InstanceName"]);
            }
        }
        catch (ManagementException)
        {
        }
        return names;
    }

الاستخدام:

        ArrayList ports = GetComFriendlyNames();
        foreach (string name in ports)
        {
            Console.WriteLine(name);
        }

إخراج المثال:

COM1 - ACPI\PNP0501\1_0

COM2 - ACPI\PNP0501\2_0

COM3 - FTDIBUSVID_0000+PID_0000+0&0000000&0&0?000_0

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top