2010-05-27 3 views
0

COMport 연결 클래스를 디자인하는 데 도움이 될 수 있습니다.C# COM 메시징 시스템 디자인

나는 내 comport에 연결된 마이크로 컨트롤러가있는 장치를 가지고있다. 메시지를 보낼 때마다 확인을 보내야합니다.

그래서 내가 comport를 통해 무언가를 보낼 때마다 계속하기 전에 확인을 기다려야합니다. Ofcourse, 나는 while(!ack) wait()과 같은 것을 원하지 않습니다.

ack가 1 초 내에 수신되지 않으면 명령을 다시 보내야합니다. Ack는 각 명령 유형에 따라 다르게 보입니다 (참고 : 유형에만 메시지 고유 ID 없음). 연결된 장치는 또한 응용 프로그램 자체에서 처리해야하는 메시지 (ACK 제외)를 보냅니다.

아무도 쉽고 유연한 방법에 대한 제안을 갖고 있습니까 (디자인 패턴은 아마도 샘플입니까?) 이것을 고치려면?

답변

1

아마도 통신을 처리하는 전용 스레드가 필요할 것입니다. 클라이언트 코드가 메시지를 푸시 할 수있는 대기열이 필요하며 ReaderWriterLockSlim로 메시지를 보호 할 수 있습니다. DataReceived 이벤트가 필요 없으며 SerialPort.Read()를 직접 호출하면됩니다. ReadTimeout 속성으로 제한 시간을 감지합니다. 클라이언트 코드로 되돌아 가야하는 응답을 받으면 이벤트를 사용하십시오.

프로토콜 설계에주의를 기울여보십시오. 쉽지 않습니다. 당신은 당신의 체계에서 바이트의 손실로부터 보호 할 것이지만, ACK가 손실 될 가능성이 있습니다. 마이크로 컨트롤러는 동일한 명령을 두 번 보게됩니다. 이제는 복제본을 억제하는 "메시지 번호"와 양쪽 끝의 동기화를위한 방법이 필요합니다. RFC 916을 살펴보십시오.

+0

고마워요, 제가 말한 것을 정확히 얻은 것 같습니다. 헌신적 인 스레딩 등으로 뭔가를 만들 수있을 정도로 경험이 없다고 생각합니다. (샘플이 필요할 것입니다.) 제가 찾고 있던 키워드를 "비동기식"이라고했습니다. 더 많은 인터넷 검색이 도움이 될 것입니다. :) 감사합니다! – SirLenz0rlot

관련 문제