|
1. 통신 시작문자
통신 결과창에 나타나는 값은 통신 시작문자와 종료문자가 제외된 값이 나오는 경우가 많기 때문에
님께서 추측하신 것은 아닐 확률이 높습니다.(확실히 아니다라고는 정의 못함)
통신포맷을 정확하게 확인하고 싶으시면 상대측에서 송신하는 정보를 하나도 거르지 말고 모두 버퍼에
저장한 후 HEX코드 값으로 메모창 같은 곳에 뿌려보면 알 수 있으리라 봅니다.
일반적으로 사용자가 확인할 수 있도록 만들어놓은 통신프로그램은 통신 시작문자와 종료문자는
보여주지 않습니다. 내용만 보여주도록 하는게 일반적이죠.
그러므로 정확한 코드값을 확인하기 위해서는 매뉴얼을 보시든 위의 방법으로 확인하여야 합니다.
제 경우는 예전에 데이터 값중에 '0x02','0x03'등의 값이 포함되기 때문에 통신 시작문자와 종료문자를
'0x82', '0x83'으로 사용한 경우도 있었습니다. 프로그램 소스상에
#define STX 0x82
#define ETX 0x83
으로 정의하여 사용했기 때문에 소스만 보았을 경우 ASCII CODE의 이름대로 STX를 '0x02', ETX를 '0x03'
으로 인지하여 상대측에서 사용하였다면 물론 통신이 안되었을 겁니다. (응답쪽도 제가 프로그램 해서 그런
문제는 없었지만)
2. ENQ <-> ACK
ENQ(0x05)를 사용하는 대부분의 경우는 정상적인 경우 응답을 ACK(0x06)로 시작하는 응답을 하고
비정상적인 경우 응답을 NAK(0x15)로 하는 것이 일반적인 방법입니다. 따라서
ENQ <-> ACK 는 정상적인 응답관계로 보고
ENQ <-> NAK 는 정상적이지 않은 상황의 응답관계로 보면 됩니다.
3. [DC4]
이것은 종료문자가 아니라 제가 볼때는 데이터의 신빙성을 검증하는 Check Sum이 아닌가 생각됩니다.
전송된 문자열이 노이즈의 영향을 받았는지를 판단하기 위해서 통신 파라미터상에 Parity 검사를
사용하기도 하지만 그에 더하여 통신 시작문자의 다음 Byte로부터 Check Sum문자가 시작되기 전까지의
문자를 모두 SUM하여(SUM 방법은 여러가지가 있으므로 상대방의 계산 방법을 확인하여 동일한 방법으로
계산하여야 한다) 그 값을 넣어준 것이라 생각됩니다.
만약 이 값이 Check Sum일 경우에 통신 종료문자는 Check Sum 직전에 올 수도 있고 Check Sum 다음에
올 수도 있습니다.
그럼 이만...
요쿠르트 님이 쓰신 글 :
: STX에 관한 궁금증 조금은 풀렸음다..^^*
:
: 근데요..
: 아직 ENQ <-> ACK 이 부분은 잘 이해가 안되거든요...
:
: 가령 제가 지금 쓰는 프로토콜이 ademco high라는 건데..
: 포멧이
: 8RRLAAAAsCCCCsCCCCsC[DC4] 거든요..
: 8 = Protocol number / RR = Receiver number
: L = Line number / AAAA = Accout code
: s = Space / CCCC = Channel 1-4
: s = Space / CCCC = Channel 5-8
: s = Space / C = Channel 9
: [DC4] = Terminator
:
: 이중에서 제가 추출해서 쓰는건 RR, AAAA, CCCC, CCCC, C 고요..
:
: 그럼 여기서 8(Protocol number) 부분이 STX란 말인가요? 아님 STX같은 역활이라서..
: if(buffer[0] == 0x08) 뭐 이렇게 체크해야하는 건가요?
:
: 그리고 여기서 ETX역활을 하는게 [DC4]가 되는 건가요?
: 근데 [DC4]는 어떻게 확인하죠?
: if(buffer[i] == [DC4]) 이렇게 하는건가요?(설마 아니죠?--?)
:
: 그리고 위의 프로토콜이라면..
: 확인 메세지는 어떤형식으로 보내야하는건가요??
|