모노에있는 직렬 포트의 "친절한"이름을 얻고 크로스 플랫폼을 유지하려면 어떻게해야합니까?

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

문제

나는이 질문을했다 :
여러 플랫폼의 모노의 직렬 포트 (RS232)

그리고 이것은 관련이 있습니다.
Windows에서 COM 포트의 친숙한 이름을 어떻게 얻습니까?

그러나 나는 Windows에서 "친절한"이름을 얻을 수 있고, 그런 것이 있다면 Linux /Mac에서도 가능합니다.

크로스 플랫폼 방법이 있습니까? 아니면 운이 좋지 않습니까?

여기 내 현재 앱에서 내가하고있는 일이 있습니다. 기본 C ++ Win32에 적합합니다.

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

어쨌든 그것은 교차 플랫폼 분포를위한 예쁜 솔루션처럼 보이지 않습니다. 누구든지 제안이 있습니까?

편집 - 사람들이 내가 요구하는 것을 이해하는 데 어려움을 겪고 있기 때문에 : 예를 들어 - COM9는 친근한 이름이 아닙니다. "com9 -USB 커넥터"또는 그와 비슷한 것을 원합니다. 위의 링크에서는 Win32에서 가능합니다. 그것은 불쾌하고 해킹되지만, 최종 사용자는 "COMN"보다 유용한 이름이없는 한 내 프로그램에서 어떤 COM 포트를 열어야하는지 전혀 모른다.

도움이 되었습니까?

해결책

Afaik Linux의 Comm Devices에는 "친숙한"이름이 없습니다. 내가 제안하는 것은 /dev /ttys#을 Linux 환경에서 장치 이름으로 사용하여 Windows에서 Comm#로 나열하는 것입니다.

Linux 사용자는 용어를 이해하여 걱정할 필요가 없습니다.

다른 팁

보는 것을 고려하십시오 SerialPort.GetPortNames() 정적 방법. .NET 2.0에서 사용할 수 있으며 모노에서도 구현 된 것 같습니다. http://www.go-goono.com/docs/에 따르면 Mono Docs 페이지에 따르면 GetportNames는 Mono Serial Port 개체에 존재하므로 샷을 줄 것입니다.

구현 된 경우 컴퓨터에서 사용할 수있는 포트 이름이 포함 된 C# 배열을 반환해야합니다. 이것들은 당신이 가진 기본 OS에 대해 이해해야합니다. 예를 들어, Windows에서는 com1, com2, com4 등을 반환합니다. 필요한 문자열을 반환해야합니다 PortName 재산.

업데이트:

살펴 봅니다 모노 데브 메일 링리스트의 게시물 *닉스 환경에서 작동하는 것 같습니다.

WMI에서 다음 쿼리를 사용해보십시오.

"Win32_PnPentity에서 이름을 선택하고" "COM"이 포함 된 객체를 검색합니다. 예를 들어, 내 컴퓨터에 USB 시리얼 컨버터 장치가 설치되어 있습니다.

USB60FPW USB-SERIAL CONVERTER (COM6)

WMI를 살펴 봐야합니다. 나는 이것을 직접 실행할 수 없었지만 당신이 결합하면 이 기본 프레임 워크 WMI 객체를 검색하는 방법 이 문서Win32_SerialPort 수업, 나는 당신이 무언가를 해결할 수 있다고 생각합니다.

기본적으로, 당신은 모든 Win32_SerialPort시스템에서 S를 반복합니다. "캡션"또는 "설명"또는 "이름"을 원할 수도 있습니다. 내 최선의 조언은 브레이크 포인트를 설정하고 디버그 모드에서 객체의 속성을 확인하여 인구가 발생하는 내용을 정확히 파악할 수있는 것입니다.

암호:

    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