Как я получаю дружественное название COM-порта в Windows?

Предполагая, что вы хотите открыть свою деятельность нажатием кнопки, затем,

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String destination = destinationSpinner.getSelectedItem().toString();
                String location = locationSpinner.getSelectedItem().toString();
                Intent intent = new Intent(CurrentActivity.this,NextActivity.class);
                intent.putExtra("destination",destination);
                intent.putExtra("location",location);
                startActivity(intent);
            }
        });

Вы намеренно передаете значения пункта назначения и местоположения NextActivity.

14
задан RichieACC 20 November 2008 в 11:12
поделиться

4 ответа

Давным-давно я записал утилиту для клиента, чтобы сделать просто это, но для GPS, а не модема.

я только что посмотрел на него, и биты, которые выскакивают как являющийся возможно полезным:

    GUID guid = GUID_DEVCLASS_PORTS;

SP_DEVICE_INTERFACE_DATA interfaceData;
ZeroMemory(&interfaceData, sizeof(interfaceData));
interfaceData.cbSize = sizeof(interfaceData);

SP_DEVINFO_DATA devInfoData;
ZeroMemory(&devInfoData, sizeof(devInfoData));
devInfoData.cbSize = sizeof(devInfoData);

if(SetupDiEnumDeviceInfo(
    hDeviceInfo,            // Our device tree
    nDevice,            // The member to look for
    &devInfoData
    ))
{
    DWORD regDataType;

    BYTE hardwareId[300];
    if(SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_HARDWAREID, &regDataType, hardwareId, sizeof(hardwareId), NULL))
    {
...

(Вы называете этот бит в цикле с постепенным увеличением nDevice)

и затем

BYTE friendlyName[300];
        if(SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_FRIENDLYNAME, NULL, friendlyName, sizeof(friendlyName), NULL))
        {
            strFriendlyNames += (LPCTSTR)friendlyName;
            strFriendlyNames += '\n';
        }

, который находит название устройства.

, Надо надеяться, который поможет Вам в правильном направлении.

8
ответ дан 1 December 2019 в 14:00
поделиться

Довольный это работало.

Вы могли попробовать:

Regex. Соответствие (tmpstring, "COM\s\d +"). ToString ()

для Вашего сопоставления строк.

, Поскольку стиль.NET указывает, я добавил бы "Систему использования. Текст", и я не запустил бы имена локальной переменной с прописных букв, и если бы я чувствовал себя действительно добродетельным, то я, вероятно, вставил бы SetupDiDestroyDeviceInfoList наконец {} пункт.

1
ответ дан 1 December 2019 в 14:00
поделиться

Информация, размещенная Will Dean , была самой полезной. Это - код, который в конечном счете работал на меня. Все в классе PInvoke было взято дословно от http://www.pinvoke.net . Я действительно должен был изменить тип данных здесь или там заставить его работать (как при использовании перечисления вместо uint), но должно быть легко выяснить.

internal static string GetComPortByDescription(string Description)
{
    string Result = string.Empty;
    Guid guid = PInvoke.GUID_DEVCLASS_PORTS;
    uint nDevice = 0;
    uint nBytes = 300;
    byte[] retval = new byte[nBytes];
    uint RequiredSize = 0;
    uint PropertyRegDataType = 0;

    PInvoke.SP_DEVINFO_DATA devInfoData = new PInvoke.SP_DEVINFO_DATA();
    devInfoData.cbSize = Marshal.SizeOf(typeof(PInvoke.SP_DEVINFO_DATA));

    IntPtr hDeviceInfo = PInvoke.SetupDiGetClassDevs(
        ref guid, 
        null, 
        IntPtr.Zero, 
        PInvoke.DIGCF.DIGCF_PRESENT);

    while (PInvoke.SetupDiEnumDeviceInfo(hDeviceInfo, nDevice++, ref devInfoData))
    {
        if (PInvoke.SetupDiGetDeviceRegistryProperty(
                hDeviceInfo, 
                ref devInfoData, 
                PInvoke.SPDRP.SPDRP_FRIENDLYNAME,
                out PropertyRegDataType, 
                retval, 
                nBytes, 
                out RequiredSize))
        {
            if (System.Text.Encoding.Unicode.GetString(retval).Substring(0, Description.Length).ToLower() ==
                Description.ToLower())
            {
                string tmpstring = System.Text.Encoding.Unicode.GetString(retval);
                Result = tmpstring.Substring(tmpstring.IndexOf("COM"),tmpstring.IndexOf(')') - tmpstring.IndexOf("COM"));
            } // if retval == description
        } // if (PInvoke.SetupDiGetDeviceRegistryProperty( ... SPDRP_FRIENDLYNAME ...
    } // while (PInvoke.SetupDiEnumDeviceInfo(hDeviceInfo, nDevice++, ref devInfoData))

    PInvoke.SetupDiDestroyDeviceInfoList(hDeviceInfo);
    return Result;
}

я думаю, что строка Result = tmpstring.Substring(tmpstring.IndexOf("COM"),tmpstring.IndexOf(')') - tmpstring.IndexOf("COM")); немного неуклюжа, предложения о том, как вымыться, она ценилась бы.

спасибо за Вашу справку с этим вопросом Will, без Вас, я все еще искал бы Google.

2
ответ дан 1 December 2019 в 14:00
поделиться

After you determine a Serial Port device is the one you want (by looking at its Friendly Name, by checking its parent device etc.), the proper way to get the port's name would probably be:

  • invoke SetupDiOpenDevRegKey(hDevInfo, devInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ) to get the HKEY to the so-called device key
  • query this registry key for the REG_SZ value "PortName"
  • don't forget to close the HKEY :)

However, this might require so much interop in C# it's not even funny, so I don't blame you if you keep to the string parsing solution.

3
ответ дан 1 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: