2011-01-13 3 views
4

Visual Studio 2010을 사용하고 C# (.NET 3.5)에서 프로그래밍하고 있습니다.C#에서 COM10 이상의 포트에 액세스

COM10에서 데이터를 쓰거나 읽으 려합니다. 여기

가에 대한 간단한 코드입니다 : 내가 SerialPort Port = new SerialPort(Portname,9600,.....);에서 "COM10"로 Portname을 사용할 때마다

static void Main(string[] args) 
{ 
    String Portname = String.Empty; 

    /* List out all COM ports present on the computer. */ 
    foreach (string ports in SerialPort.GetPortNames()) 
    { 
     Console.WriteLine(ports); 
     /* If COM10 exists, copy the name for further use. */ 
     if (ports == "COM10") 
     { 
      Portname = ports; //I also tried this: "\\.\\COM10"; 
     } 
    } 
    /* If COM10 not found, return */ 
    if (Portname == String.Empty) 
    { 
     Console.WriteLine("Exiting"); 
     return; 
    } 

    SerialPort Port = new SerialPort(Portname, 
            9600,   // Baudrate 
            Parity.None, //Parity 
            8,    //DataBits 
            StopBits.One); //Stop Bits 

    Port.Open(); 

    for (int count = 0; count < 5; count++) 
    { 
     Port.WriteLine("\nHello"); 
    } 
    Port.Close(); 

    while (true); 
} 

, 그것은 포트 'COM10이'

존재하지 않습니다

같은 오류를 제공합니다

Port.Open()에 COM10이 없으면 Port.Open() 명령에 도달하지 않아야합니다.

다른 방법으로 Portname을 "\. \ COM10"으로 시도했습니다.

주어진 포트 이름이 COM/com으로 시작되지 않거나 유효한 직렬 포트로 해결되지 않습니다.

이는 COM9보다 큰 모든 포트 번호에서 발생합니다.

탈출구가 있습니까?

+0

ops 죄송합니다. 이미 사용하고 계신 것을 확인하지 못했습니다. 방금 포트 == "COM10"을 보았고 당신이 그것을 통과 시켰다고 가정했습니다.이 경우 어쩌면 당신은 @Robert Harvey의 방법을 시도 할 수 있습니다. com 포트를 탈출 한 방법은 적절한 unc 경로가 아닙니다. 어쩌면 @ "\\. \ COM10"을 사용해보십시오. – user44298

+1

"\. \"을 시도하고 있지만 "\\. \"(이스케이프와 함께 끝나는 "\\\\. \\"이어야 함)에 유의하십시오. 그러나 어쨌든, 이것은'CreateFile'을 위해 필요했습니다. .NET에서이 트릭이 필요 없다고 생각했습니다. – mtrw

+0

@ivo s & @mtrw 두 트릭이 작동하지 않았습니다 ... "포트 이름을 '\'으로 시작할 수 없습니다."오류가 발생합니다. – Swanand

답변

0

GetPortNames() 또는 Open()이 문제를 일으키지 않는다고 생각합니다. 내 하드웨어와 관련된 것입니다. 다른 컴퓨터에서 코드를 사용해 보셨습니까?

불행히도 두 자리 포트가 항상 나를 위해 일했기 때문에 시나리오에 대한 직접적인 경험이 없습니다 ...하지만 주목할 점이 하나 있습니다. 시간이 지나면 더 나은 점을 배웠습니다. 미안한 것보다 안전하기 때문에 try-catch 블록을 많이 사용하게되었습니다. 귀하의 경우에는, 나는이 작업을 수행 할 것 : 초기 검사 방법

 TryOpeningPort("COM10"); 

또는 사용 :

static System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); 
    private static int defaultBaudRate = 9600, defaultDataBits = 8; 
    static System.IO.Ports.SerialPort TryOpeningPort(string portName) 
    { 
     System.IO.Ports.SerialPort port = null; 
     timer.Start(); 
     try 
     { 
      port = new System.IO.Ports.SerialPort(portName, 
       defaultBaudRate, System.IO.Ports.Parity.None, defaultDataBits, System.IO.Ports.StopBits.One); 
      port.Open(); 
      port.Close(); 
      /**/Console.WriteLine(portName + " : OK"); 
     } 
     catch (Exception exceptionInfo) //most common is System.UnauthorizedAccessException 
     { 
      port = null; 
      /**/Console.WriteLine(portName + " -- " + exceptionInfo.GetType().ToString() + " : " + exceptionInfo.Message); 
     } 
     timer.Stop(); 
     //Console.WriteLine("Elapsed time : " + timer.ElapsedMilliseconds + "ms" + System.Environment.NewLine); 
     timer.Reset(); 
     return port; 
    } 

당신은 같이 직접하거나이를 호출 할 수 있습니다

 foreach (string portName in System.IO.Ports.SerialPort.GetPortNames()) 
      if (portName.Equals("Com10", StringComparison.InvariantCultureIgnoreCase)) 
       TryOpeningPort(portName); 
0

FCL SerialPort가 다음 샘플 에서처럼 구현 되었기 때문에 10보다 큰 직렬 포트를 열 수없는 이유는 다음과 같습니다.

[MonitoringDescription("PortName")] 
[Browsable(true)] 
[DefaultValue("COM1")] 
public string PortName 
{ 
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get 
    { 
    return this.portName; 
    } 
    set 
    { 
    if (value == null) 
     throw new ArgumentNullException("PortName"); 
    if (value.Length == 0) 
     throw new ArgumentException(SR.GetString("PortNameEmpty_String"), "PortName"); 
    if (value.StartsWith("\\\\", StringComparison.Ordinal)) 
     throw new ArgumentException(SR.GetString("Arg_SecurityException"), "PortName"); 
    if (this.IsOpen) 
     throw new InvalidOperationException(SR.GetString("Cant_be_set_when_open", new object[1] 
     { 
     (object) "PortName" 
     })); 
    else 
     this.portName = value; 
    } 
} 

표준 SerialPort에서는 \\. \ notation을 포트 이름으로 사용할 수 없습니다. 그리고 나는 그들이 왜 이것을했는지 모른다. \\. \ 표기법을 사용하면 10보다 큰 포트를 열 수 있습니다. 그래서, 유일한 방법은 자신의 SerialPort 구성 요소를 구현하는 것입니다.

작거나 같은 포트
0
  • 9 : 9보다 큰 포트 new SerialPort("COM9")
  • : 나는 9보다 큰 포트의 속성 serialArduino.PortName = ...의 사용을 테스트하지만,이 항상 이끌고

new SerialPort("\\\\.\\COM10") 오류가 발생하여 new SerialPort() 생성자를 사용했습니다.

관련 문제