문제

나는 계획에 다시 쓰기 Win32 응용 프로그램(native C++)습니다.NET-대부분 사용 모노 그래서 나는 그것을 실행할 수 있습에 Win32,리눅스와 맥.문제를 해결(하는 데만 정말 위해 개발된 Win32)은 문제가 직렬 포트를 정의합니다.어떻게 하나는 일반적으로 식별하는 차이점에서 플랫폼에 있을 때만이 하나 있어야합니다.특히,COM 포트에서 확인 창 COM1 혹 같은 것(\.\COM)하지만 리눅스에서 그들은 지정과 같은 것으로/dev/ttyS0.

중 하나를 확인 플랫폼에 대한 런타임이 정보?

내가 생각하는 유일한 차이는 것에 열고 닫의 포트가 있습니다.의 읽고 쓰는 동일합니다.

아마도 이것은 일반적인 질문에 적용되는 모든 플랫폼-특정 물건을 모노.NET.

당신은 어떻게 이?에 어떤 문자열 자원 또는 config 파일,또는 하드 코딩과 스위치 기반으로 런타임 플랫폼?

어떤 코드에 대한 샘플 이?참고 떠 C++개발자에 익숙하지 않은 모든 클래스를 사용할 수 있습니다.NET.이 있을 얻을 수있는 방법 중 하나 직렬 포트 이름 지정 방식에서 CLR 또는 거기를 얻을 수 있는 방법 OS/플랫폼에서 CLR?

그것은 좋았을 것에 대한 CLR 할 수 있었던 현재의 직렬 포트에서 더 많은 독립적인 방식이다.어쩌면 그것은 가능하지 않습니다.

감사합니다, 팀

편집

주어진 하나의 응답이 지금까지 나는 시도해야합
SerialPort.GetPortNames()열거부를 확인하려면 먼저 그것은 작동합니다.(두 플랫폼에서)

Win32 에서 더 높은 포트 번호 및 ofr USB dongle-그것은 간단하지 않으로 기본적인 COM 포트를 열거에 있습니다.

내가 보고서는 조사 결과니다 여기에.

도움이 되었습니까?

해결책

방금이 스레드를 발견했고, 나는 단지 내 발견을 추가 할 것이라고 생각했다. 무작위로, 나는 또한 Mac에서 이것에 대해 걱정한다. Windows 및 Linux (vs 및 mono 모두)에서 Serialport.getPortNames ()는 다음 규칙으로 목록을 반환합니다.

1) Windows는 COM1, COM4와 같은 문자열 목록을 반환합니다. 존재하지 않는 사람은 누락되지 않습니다 (USB 직렬 어댑터는 직렬 포트 스캐너의 플러그를 기반으로 COM 번호를 사용하는 것으로 보입니다).

Scanning COM1 Scanning COM4 Scanning Complete

2) Linux는 Linux 배포판의 컴파일러가 활성화 한 모든 TTY 직렬 포트를 반환합니다. 이것은 약 8 포트 인 것 같습니다. 열려고하면 직렬 포트 스캐너에서 예외를 던질 것입니다.

Scanning /dev/ttyS0 Scanning /dev/ttyS1 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS2 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS3 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000]

3) Macs ...

오, 오, 오,. MAC (USB 직렬 포트가 연결되고 드라이버와 모든 것이 정상인 경우) 반환하지 않습니다. 아무것 getportNames ()에서. 나다. /dev /tty를 보면, 추가 장치는 장치가 연결되어 있고 /dev/tty.usbserial-a7006ro7과 같은 이름을 가질 때만 나타납니다. 효과가 있습니다.

더 자세히 살펴 봅니다.

다른 팁

습니다.Net,당신은 필요한 시스템입니다.IO.포트가 있습니다.이름처럼"COM1"및"/dev/ttyS0"는 임의의 OS 이름입니다.왜 필요한 하드 코딩을까?사용자가해야 하나를 선택 목록에서 사용 가능한 포트입니다.

분명히,당신은 당신이 결정에 목록을 수 있습니다.사실,USB-직렬 어댑터를 고려할 수 있습니다 가능성하는 사용자를 발견한 후 프로그램을 시작 그는 연결하는 그의 USB-직렬 아답터가 장착되어 있습니다.즉,당신해 다시 읽고 이 목록에 모든 시간을 보는 설정 대화상자.USB 접합기는 매우 가능성이 높지 않 COM1,BTW.

(난 보증할 수 없습에 대한 품질의 모노의 구현 SerialPort.빠른 google 검색이 왼쪽에 나에게 조금 걱정했지만,자신을 테스트)

나는 이것을 살펴 보았고 직렬 포트를 열거하는 모노 코드는 Linux 외에는 아무것도 작동하지 않을 것 같습니다.

(MCS/Class/System.io.ports/Serialport.cs에서)

            public static string [] GetPortNames ()
            {
                    int p = (int) Environment.OSVersion.Platform;
                    List<string> serial_ports = new List<string>();

                    // Are we on Unix?
                    if (p == 4 || p == 128 || p == 6) {
                            string[] ttys = Directory.GetFiles("/dev/", "tty*");
                            foreach (string dev in ttys) {
                                    if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB"))
                                            serial_ports.Add(dev);
                            }
                    } else {

OSX에서는 아마도 /dev/tty.*와 일치 할 수 있다고 생각합니다 (freebsd는 /dev /ttyu [0-9]+가 필요합니다.

나는 그것이 어떤 os에서 실행되는지를 선택하는 방식에 매혹된다고 말할 수 없다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top