2010-06-03 6 views
3

직렬 포트에서 데이터를 받기 위해 C#을 사용하고 있지만 몇 가지 문제가 있습니다. 나는이 일에 익숙하지 않아 도움이 필요하다..NET에서 직렬 포트 통신

  1. 우선 내가 이벤트가 구동되는 기능을 알고 싶은 모든 :

     
    ReadExisting() 
    Read() 
    Readbyte() 
    Readchar() 
    ReadLine() 
    Readto() 
    
  2. 어떻게 필요한 데이터가이 포트의 입력 스트림을 형성 할 수 있지?

    정적 인 프로토콜이 있습니다. 프로토콜 데이터의 한계를 지정하기 위해 특수 문자를 사용할 수 있습니까?이 문자는 적절한 문자가 될 수 있습니까? 나는이 예외 처리 어떻게

  3. :

    C#하여 SerialPort System.ObjectDisposedException을, 안전 손잡이가 이러한 방법

답변

6

아무도 없습니다 System.dll을 폐쇄되었습니다 "이벤트 구동 ", 당신은 DataReceived 이벤트에서 그것들을 사용할 것입니다. 직렬 포트에 읽을 수있는 데이터가 적어도 1 바이트 이상있을 때 호출됩니다.

정적 크기가 무엇인지 알 수 없습니다. 장치가 고정 된 바이트 수를 전송하면 Read() 메서드를 사용하여 읽습니다. 반환 값에주의를 기울이면 사용 가능한 바이트 수만 확보됩니다. 바이트를 []로 저장하고 모두 DR을 얻을 때까지 다음 DR 이벤트에 추가하십시오.

장치가 바이트가 아닌 문자를 보내는 경우 일반적으로 NewLine 속성을 활용할 수 있습니다. 응답을 종료하는 문자 또는 문자열로 설정하십시오. 줄 바꿈 ("\ n")이 가장 일반적인 선택입니다. ReadLine()으로 응답을 읽으십시오. 이 경우 버퍼링이 필요하지 않습니다.

양식을 닫을 때 ObjectDisposed 예외가 발생하지만 장치의 데이터 전송이 중지되지는 않습니다. Invoke가 아닌 DataReceived 이벤트에서 BeginInvoke 만 사용해야합니다. 그리고 폼의 IsDisposed 속성이 true 인 경우 BeginInvoke를 호출하지 마십시오.

6

내가 본 가장 큰 함정 중 하나는 사람들이 DataReceived 이벤트가 발생하면 수신하려는 모든 바이트가 모든 선물.

메시지 프로토콜이 20 바이트이면 DataReceived 이벤트가 발생하고 20 바이트를 읽으려고합니다. 그들은 모두 거기에 있을지도 모릅니다. 당신의 보오율 (baud rate)에 따라 그렇지 않을 가능성이 높습니다.

읽는 포트의 BytesToRead 속성을 확인하고 해당 금액을 버퍼로 읽어야합니다. 더 많은 바이트를 사용할 수 있으면 DataReceived 이벤트가 다시 발생합니다.

수신 할 바이트 수가 직렬 포트의 ReceivedBytesThreshold 속성과 적어도 같으면 DataReceived 이벤트가 발생합니다. 기본적으로이 값은 1로 설정되어 있습니다.

예를 들어 10으로 설정하면 수신 대기중인 바이트가 10 개 이상 있지만 그 이하가 아닌 경우 이벤트가 실행됩니다. 이것은 문제를 일으킬 수도 있고 그렇지 않을 수도 있습니다. 개인적으로이 속성 값을 1로 설정하면 수신 된 모든 데이터가 1 ​​바이트 만 수신 되더라도 이벤트가 발생합니다.

수신 한 모든 바이트에 대해 이벤트가 실행되도록 실수하지 마십시오. 그렇게하지 않습니다.