سؤال

أنا أبحث عن وسيلة قوية إلى قائمة المتاحة تسلسلي (COM) المنافذ على جهاز ويندوز.هناك هذا المنصب حول استخدام WMI, ولكن أود شيء أقل .صافي محددة - أريد الحصول على قائمة الموانئ في بيثون أو C++ برنامج دون .صافي.

أنا حاليا اثنين من الأساليب الأخرى:

  1. قراءة المعلومات في HARDWARE\\DEVICEMAP\\SERIALCOMM مفتاح التسجيل.هذا يبدو وكأنه خيار كبير, ولكن هل هو قوية?لا أستطيع العثور على ضمان على الانترنت أو في MSDN أن هذا التسجيل الخليوي في الواقع يحمل دائما على قائمة كاملة من المنافذ المتوفرة.

  2. Tryint الاتصال CreateFile على COMN مع N رقم من 1 إلى شيء.هذا ليس جيدا بما يكفي لأن بعض منافذ COM لا يدعى COMN.على سبيل المثال ، بعض الظاهرية منافذ COM التي تم إنشاؤها اسمه CSNA0, CSNB0, وهلم جرا, حتى لا تعتمد على هذا الأسلوب.

أي أساليب أخرى/أفكار/تجربة للمشاركة ؟

تحرير: بالمناسبة هنا الثعبان بسيط تنفيذ القراءة ميناء أسماء من التسجيل:

import _winreg as winreg
import itertools


def enumerate_serial_ports():
    """ Uses the Win32 registry to return a iterator of serial 
        (COM) ports existing on this computer.


    """
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    try:
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
    except WindowsError:
        raise IterationError

    for i in itertools.count():
        try:
            val = winreg.EnumValue(key, i)
            yield (str(val[1]), str(val[0]))
        except EnvironmentError:
            break
هل كانت مفيدة؟

المحلول

تتوفر عدة خيارات:

  1. الاتصال QueryDosDevice مع NULL lpDeviceName إلى قائمة جميع دوس الأجهزة.ثم استخدام CreateFile ، GetCommConfig مع كل اسم الجهاز بدوره إلى معرفة ما إذا كان المنفذ التسلسلي.

  2. الاتصال SetupDiGetClassDevs مع ClassGuid من GUID_DEVINTERFACE_COMPORT.

  3. WMI هو متاح أيضا إلى C/C++ برامج.

هناك بعض الحديث عن win32 أخبار و CodeProject إيه ، المشروع.

نصائح أخرى

باستخدام pySerial مع بيثون:

import serial.tools.list_ports


ports = list(serial.tools.list_ports.comports())
for p in ports:
    print p

على PySerial المشروع يوفر بعض الحلول.

لقد خلق التالية ، بناء على القراءة من خلال C++ المصدر EnumSerialPorts ورؤية وظيفة GetDefaultCommConfig().يبدو أبسط طريقة استخدام بسيطة ANSI C API واحد دعوة لكل من الممكن منفذ COM.

#include <stdio.h>
#include <windows.h>
#include <winbase.h>

BOOL COM_exists( int port)
{
    char buffer[7];
    COMMCONFIG CommConfig;
    DWORD size;

    if (! (1 <= port && port <= 255))
    {
        return FALSE;
    }

    snprintf( buffer, sizeof buffer, "COM%d", port);
    size = sizeof CommConfig;

    // COM port exists if GetDefaultCommConfig returns TRUE
    // or changes <size> to indicate COMMCONFIG buffer too small.
    return (GetDefaultCommConfig( buffer, &CommConfig, &size)
                                                    || size > sizeof CommConfig);
}

int main()
{
    int i;

    for (i = 1; i < 256; ++i)
    {
        if (COM_exists( i))
        {
            printf( "COM%d exists\n", i);
        }
    }

    return 0;
}

هذا هو بالتأكيد إلى حد ما في وقت متأخر ، ولكن ثبت مفيدة بالنسبة لي!

http://eli.thegreenplace.net/2009/07/31/listing-all-serial-ports-on-windows-with-python/

ولا سيما هذا المثال:

import re

def full_port_name(portname):
    """ Given a port-name (of the form COM7,
        COM12, CNCA0, etc.) returns a full
        name suitable for opening with the
        Serial class.
    """
    m = re.match('^COM(\d+)$', portname)
    if m and int(m.group(1)) < 10:
    return portname
return '\\\\.\\' + portname

هناك مثال في pyserial توزيعة الآن هل هذا يسمى scanwin32.py

http://pyserial.sourcearchive.com/documentation/2.5/scanwin32_8py_source.html

أعتقد WMI هو الطريق للذهاب لأنه من السهل جدا الذهاب و لديه الحد الأدنى من التعليمات البرمجية.فإنه يوفر لك من الاضطرار إلى حفر داخل التسجيل و يعطيك بعض ما يضمن أنه سوف يعمل للحصول على مزيد من الحالات في المستقبل.

يمكنك تثبيت كل ما يلزم مع pip install pypiwin32 WMI وأنه يعمل من خارج منطقة الجزاء.

رمز

import wmi

query = "SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%)'"
coms  = wmi.WMI().query(query)

for com in coms:
    print(com.Name)

الإخراج

Communications Port (COM1)
mbed Serial Port (COM3)
mbed Serial Port (COM5)

اعتقد ان المنفذ التسلسلي هو نوع من المكونات ن اللعب حتى هذا يجب أن تعمل بشكل جيد.لسبب ما Win32_SerialPort لا يعمل على جميع المنافذ.

في الوقت الحاضر هناك Powershell بطانة واحدة عن ذلك.

[System.IO.Ports.SerialPort]::GetPortNames()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top