2012-08-09 3 views
0

(편집자 주이 아마 관련. : SerialPort Class를) 직렬 포트를 통해 더 라인을 수신. "대답"나는을의 RFID 판독기에 명령을 전송하고 수신하기 위해 노력하고있어보내기 및

예를 들어 port.Write("S")port.ReadLine()은 독자가 태그를 읽을 수 있으면 UID를받습니다.

이 같은 SerialDataReceivedEventHandler 사용하고 있습니다 :

port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    port.ReadLine(); 
} 

을 내가 명령 보내고있다 곳은 다음과 같습니다

public void sendData() 
{ 
    port.Write("S"); 
    port.Write("r01"); 
    port.Write("r02"); 
} 

하는 것은 이제 문제는 "I가 첫 번째 대답을받을 수있다 S "와 3 줄 모두를 전송하지 않습니다. 문제는 3 가지 명령을 모두 독자에게 보내는 방법을 모른다는 것입니다.

public void sendandreceive() 
{ 
    port.Write("S"); 
    port.ReadLine(); 
    port.Write("r01"); 
    port.ReadLine(); 
} 

그 코드를 보내고 명령과 답변을 모두받을 것이다 : 나는 SerialDataReceivedEventHandler을 무시하면

나는이 코드를 사용할 수있는 찾을 수 있습니다. 그러나 나는 SerialDataReceivedEventHandler을 사용하는 것이 좋습니다.

+0

'port.WriteLine ("S");'maybe? – leppie

답변

1

DataReceived 이벤트가 발생하면 더 많은 데이터가 도착하지 않으면 다시 발생하지 않습니다. 무슨 일이 일어나고 직렬 포트의 버퍼가 세 가지 응답을 모두 포함하고 당신은 하나만 읽고 있습니다.

구문 분석해야하는 메시지 구조가있는 경우 DataRecived를 사용하는 것이 복잡 할 수 있습니다. 각 메시지는 EOL 종결 자로 끝납니다. 이 문제를 해결하는 데는 여러 가지 방법이 있습니다.

사용 가능한 모든 바이트를 버퍼로 읽고 완전한 메시지를 꺼낸 다음 메시지 당 하나씩 다른 이벤트를 실행할 수 있습니다. 버퍼에 부분 메시지가 있으면 다음 DataReceived 이벤트 때까지 두십시오.

완료되면 신호를 보내는 비동기 작업으로 전체 작업 (위 예제에서 sendandreceive)을 수행 할 수 있습니다. 이것은 가장 간단한 방법입니다. SerialPort.ReadLine은, 시간 내에 완전한 "선"을 취득하지 않으면, TimeoutException를 슬로우 해, TimeoutException를 throw 할 수 있습니다. 이 때문에 가장 강력한 해결책은 아닙니다. 작업 시간이 초과되면 수행 할 작업을 고려해야합니다 (버퍼에 불완전한 메시지가있을 수 있음).

사용하는 방법은 응용 프로그램의 특성에 따라 다릅니다. 프로토콜은 항상 "명령을 보내고 응답을 받습니까?" 또는 일부 명령으로 인해 지속적인 응답이 발생합니까?

직렬 통신을 올바르게 (강력하게)하는 것은 어렵습니다. 가장 쉬운 솔루션부터 시작해서 조심스럽게 테스트 해 보겠습니다.

+0

답변 해 주셔서 감사합니다. (press enter는이 게시물을 저장합니다. 잘 알고 있습니다. D) 다른 방법은 제가 시도한 것은 port.Write (comman)와 .ReadLine을 port_DataReceived (객체 발신자, SerialDataReceivedEventArgs e)에 넣었고 count가 var 케이스. 예를 들면 다음과 같습니다. case 0 : .write ("S") count ++ break; case 1 : .write ("r01") 카운트 ++ break; 정보를 저장하는 문자열 [] 등이 있습니다. string [count] = .ReadLine(); 당신이 내가이 게시물의 형식을 정하는 방법을 모르겠다는 뜻인지 알기를 바랍니다. 나는 비동기 방법을 시도 할 것이다. 나는 그것을 시도하자마자 게시 할 것이다. – Manuel

0

sendandreceive 메서드를 사용하면 정상적으로 작동하므로 여기를 사용하고 SerialDataReceivedEventHandler은 사용하지 않습니다.

모든 직렬 포트 예제에서 SerialDataReceivedEventHandler이 사용 되었기 때문에 약간 혼란 스러웠습니다.

여전히 문제가없는 것으로 판명되기 전에 테스트해야합니다. 즉, 나는 다른 제안에 열려 있습니다.