2014-04-30 3 views
2

테스트를 통해 .Net SerialPort 객체를 통해 통신을 거부하는 두 대의 랩톱을 발견했습니다. 아마도 응용 프로그램이 .Net 4.0을 사용하고 있다고 말하는 것으로 시작해야합니다. 이 설정입니다 :.Net SerialPort 객체가 통신하지 않습니다.

  • 두 노트북은 테라 기간 이러한 직렬 포트를 사용하여 통신 마더 보드 또는 포트가 테스트되고
  • 어떤 USB 시리얼 포트 에뮬레이터의 내부 직렬 포트 중 하나에 통신이 없다
  • 이 아니며이 이미 사용 중입니다.
  • 없음 예외는
  • 이 소프트웨어는 객체가 이전에 초기화되는 방법을 ErrorReceived 이벤트 핸들러는
  • 여기

라고하지 않을

  • 데이터를 전송 COM 포트를 열 수는 없지만 트리거되지되고있다 이 설정은 적어도 20 개의 다른 컴퓨터에서 테스트되었으며 잘 작동합니다.

    serialPort.Write(packet, 0, nBytes); 
    

    패킷이 byte[]하고 nBytes 전송 될 데이터의 길이 : 포트 단순히 호출 오전에 기록합니다. 소프트웨어가 직렬 포트를 열고 지연 후 포트가 데이터를 전송하지 않고 닫히기 때문에 쓰기 타임 아웃이 트리거 된 것처럼 보입니다.

    다음 로그를 직렬 포트 모니터로 캡처 할 수있었습니다. first log은 COM 포트가 열리고 구성된 다음 데이터가 전송되기를 기대합니다. second log은 랩톱 중 하나입니다. 포트가 열리는 것을 볼 수 있지만 포트는 아무 것도 전송하지 않고 닫힙니다.

    로그 파일에는 두 가지 주요 차이점이 있습니다. 랩톱의 로그에는 RTS off이 포함되어 있으며 좋은 로그는 아닙니다. 또한 랩톱의 로그는 쓰기 타임 아웃을 0으로 설정 한 것으로 보입니다. 이 노트북에서

    Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=-1, ReadTotalTimeoutConstant=10000, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=1000 
    

    그리고 로그 : 좋은 로그에서

    Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=-1, ReadTotalTimeoutConstant=-2, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0 
    

    는 어떻게이 문제의 원인이 될 수 있으며, 나는 그것을 중지하기 위해 무엇을 할 수 있는가?

  • +0

    로그에서 핸드 쉐이킹을 문제로 지적 했으므로 핸드 쉐이킹을 비활성화하여 다시 시도하십시오. 아마도 신호가 RS-232의 허용 전압 범위를 약간 벗어나거나 전체 범위를 수용하지 못할 수도 있습니다. 랩톱 컴퓨터의 포트는 데스크톱보다 전력을 절약하는 경향이 있으므로 사양의 더 낮은 전압 범위에서 작동합니다. –

    답변

    2

    다른 프로젝트에 대한 조사를하면서이 문제에 대한 해결책을 찾은 것처럼 보입니다. 나는 Arduino 포럼에서 ATmega32U4 (적절한 USART가있는)와 비슷한 문제를 겪고있는 게시판을 발견했습니다.

    내가 간과 한 SerialPort에는 SerialPort.DtrEnableSerialPort.RtsEnable이라는 두 가지 속성이있는 것으로 보입니다. 이 두 가지 속성을 true로 설정 한 후

    serialPort = new SerialPort(); 
    serialPort.PortName = SelectSerialPort.GetSerialPort(); 
    serialPort.BaudRate = 9600; 
    serialPort.Parity = Parity.None; 
    serialPort.DataBits = 8; 
    serialPort.StopBits = StopBits.One; 
    serialPort.Handshake = Handshake.None; 
    serialPort.DtrEnable = true; 
    serialPort.RtsEnable = true; 
    serialPort.ReadTimeout = 10000; 
    serialPort.WriteTimeout = 1000; 
    serialPort.ErrorReceived += OnSerialError; 
    

    이, 아니 핸드 쉐이크와의 통신이 일을 시작 :

    우승 조합은 다음과 같은 구성 될 것으로 보인다.그러나 실행 파일을 관리자 권한으로 실행해야만 액세스 거부 메시지가 표시됩니다.

    관련 문제