2012-02-14 33 views
0

시간이 많이 걸렸지 만 해결하지 못한 문제가 발생했습니다. 정말 도움이 필요합니다.시리얼 포트에서 데이터를 수신 할 때 혼란스러운 경우

나는 C# wpf로 빌드 된 응용 프로그램을 가지고 있으며 직렬 포트를 통해 오븐과 통신합니다.

보내야하는 프레임은 다음과 같은 형식이어야합니다. [EOT] (GID) (UID) (Temp) [ENQ] gid uid : 그룹 식별자 및 장치 식별자 (장치의 주소). (eof), (enq) : 메시지 프레임. (temp) 의미 : 온도 값을 알려주십시오.

동일한 주소를 가진 유일한 기계가 응답 할 수 있습니다 (마스터 슬레이브 아키텍처).

응답 메시지의 형식은 다음과 같습니다. [STX] (Temp) <DATA> [ETX]. 필드는 온도 값 stx 시작 텍스트 만 포함합니다. etx 최종 텍스트.

나는 데이터 송수신에 아무런 문제가 없으며 연결된 단일 기계에 대한 온도 값을 표시 할 수 있습니다. 하지만 더 많은 컴퓨터를 연결할 때 응답 프레임에 주소가 없으므로 어느 시스템이 내가 보낸 프레임에 응답했는지 알 수 없으므로 응답 할 오븐을 결정할 수 있습니다.

간략한 상황은
-I 데이터를 오븐에 보냅니다.
- 데이터를 받았습니다.
- 어떤 오븐이 대답했는지 결정할 수 없습니다.
하나만 있으면됩니다. 내가 프로토콜 작업 : PS EUROTHERM EuroTherm

의 EI-BISYNCH이 필요한 경우 : 이런 상황에서 EI-Bisynch ASCII Sequence Diagrams

+0

글쎄, 당신은 요청을 보낸 사람을 알고 있습니다. 그래서 보낸 사람 응답에서 확인되지 않으면 조치의 유일한 과정은 새 요청을 보내기 전에 응답을 기다리는 것입니다. –

+0

@ 500 - 내부 서버 오류 : 여기서 문제는 루프에서 모든 사람에게 전송한다는 것입니다. 일부 컴퓨터가 오프라인이거나 꺼져있어서 응답 할 수 없습니다. – user1202382

+0

SerialPort.PortName이 컴퓨터와 일치합니다. –

답변

1

, 일반적인 솔루션입니다 : 우리는 내 대답을받는 경우

  1. 정의 된 타임 아웃
    • 에 대한 답변을 현재 장치에
    • 대기를 요청 보내기 시간 초과가 발생하여 기기가 응답했습니다.
    • 답변을받지 못하면 해당 장치는 오프라인 상태로 표시됩니다. 당신은 루프로 포장 할 수 있어야 다음 장치에
  2. 스위치, 고토 기본적으로 1

코드는 여기에 설명 : AutoResetEvent와 함께 작동하는 샘플입니다 Providing Asynchronous Serial Port Communication

. 동기화 스레드 (루프에서 요청을 보내는 스레드와 루프에서 메시지를 수신하는 스레드)를 허용하는 .Net 멀티 스레딩 중 하나

+0

글쎄, 나를 도와 주셔서 고마워.
나는이 probleme를 해결했다 :) – user1202382

1

, 당신은 해결 컴퓨터가 응답 (또는 적어도 그는 것으로 가정) 단일 마스터 - 멀티 슬레이브. 의미 : -

  • 마스터 -> 헤이 # 1 당신의 temp -> # 1 SIR! 알겠습니다! 23도!
  • 마스터 -> 헤이 # 2 ...

아이디어는 다른 슬레이브가 응답하지 것이다. 프로토콜의 관습에 따라.

이 시스템을 직렬로 처리하는 것은 꽤 어렵습니다.

명령 대기열과 같은 것을 만들면 디자인면에서. 각 명령은 어떤 장치와 대화할지, 그리고 어떤 질문을하고 싶은지 알고 있습니다. 각 명령을 처리하고 직렬 메시지를 보내고 응답을 얻은 다음 다시 명령에 제공합니다. 이제는 어떤 장치와 통화했는지, 그리고 그 장치의 응답이 무엇인지 알 수있는 명령이 있습니다.

+0

+1 : OP가 MODBUS RTU 버전을 사용하는 경우 모든 슬레이브 응답에는 슬레이브 주소, 데이터 및 체크 합계 값이 포함되어야합니다. – NotMe

+0

@Keith Nicholas : 좀 더 설명이나 코드를 제공해 주시겠습니까? 왜냐하면 나는 정말로 mvvm 전문가가 아니기 때문이다. @ Chris Lively : 우리가 ELbisynch를 사용하지 않는다. – user1202382

0

응답을 기다리는 "실행 중"명령이 하나만 있고 명령을 보낸 장치를 알고 있으면 다음에 응답하는 장치가 다음 장치라고 가정 할 수 있습니다. 응답하도록 요청했습니다. 이제는 장치가 프롬프트되지 않은 응답을 보낼 수있는 경우 항상 이것이 사실 일 필요는 없습니다.이러한 조건에서

관련 문제