다빛솔루션 ASCII 프로토콜의 BCC 계산 및 적용가이드

BCC(Block Check Character)는 데이터 블록 전송 중 오류를 검출하기 위한 간단한 방식으로, XOR 연산을 통해 생성된 값을 사용합니다. 본 문서는 다빛솔루션 ASCII 문자열 프로토콜에서 BCC의 계산 방법과 명령 패킷 적용 예시를 설명합니다.

BCC(Block Check Character)란?

  • BCC는 데이터 블록의 오류를 검출하기 위해 사용되는 간단한 오류 검출 방식
  • 데이터를 전송하기 전에 특정 연산(주로 XOR)을 사용해 생성된 값으로, 데이터를 송수신하는 과정에서 손상이 발생했는지 확인하는 데 사용

ASCII 프로토콜의 명령 및 응답 패킷에서 오류 검출 여부 설정 방법

  • 명령 패킷(![AEM/ ... !])의 E부분을 이용해 오류 검출 여부 설정
    • "0": 오류 검출 기능을 사용하지 않음
    • "1": 종료 문자 뒤에 BCC(오류 검출 문자) 값 추가
    • BCC 값은 시작 문자와 종료 문자를 포함해 계산
  • 명령 패킷 예: ![010/C2ABCD!]6D
  • 응답 패킷 예: ![0100!]07

BCC를 이용한 패킷 전송 및 오류 검출 절차

  1. 시작 문자(!) 및 종료 문자(])를 포함한 전체 데이터 문자열(![......!])을 ASCII 값으로 확인
  2. ASCII 값을 8비트 2진수로 변환
  3. 변환한 모든 값을 XOR 연산수행
  4. 최종 결과값을 16진수로 변환
  5. 데이터 끝부분에 추가 하여 전송
    • 컨트롤러에서 응답 패킷을 반환하면 해당 패킷은 정상 전송으로 판단
    • 컨트롤러의 BCC 계산 결과와 불일치할 경우, 해당 패킷은 적용되지 않음으로써 오류 감지 및 안정성 확보

BCC 계산 및 적용 예시1 - 숫자+영문

  1. 문자열: ![010/C2ABCD!]
  2. 각 문자의 ASCII 값 확인
    • ! = 0x21 (33)
    • [ = 0x5B (91)
    • 0 = 0x30 (48)
    • 1 = 0x31 (49)
    • 0 = 0x30 (48)
    • / = 0x2F (47)
    • C = 0x43 (67)
    • 2 = 0x32 (50)
    • A = 0x41 (65)
    • B = 0x42 (66)
    • C = 0x43 (67)
    • D = 0x44 (68)
    • ! = 0x21 (33)
    • ] = 0x5D (93)
  3. ASCII 값을 8비트 2진수로 변환
    • ! (0x21) = 00100001
    • [ (0x5B) = 01011011
    • 0 (0x30) = 00110000
    • 1 (0x31) = 00110001
    • 0 (0x30) = 00110000
    • / (0x2F) = 00101111
    • C (0x43) = 01000011
    • 2 (0x32) = 00110010
    • A (0x41) = 01000001
    • B (0x42) = 01000010
    • C (0x43) = 01000011
    • D (0x44) = 01000100
    • ! (0x21) = 00100001
    • ] (0x5D) = 01011101
  4. XOR 연산 수행 (초기값: 00000000)
    • 00000000 ^ 00100001(!) = 00100001
    • 00100001 ^ 01011011([) = 01111010
    • 01111010 ^ 00110000(0) = 01001010
    • 01001010 ^ 00110001(1) = 01111011
    • 01111011 ^ 00110000(0) = 01001011
    • 01001011 ^ 00101111(/) = 01100100
    • 01100100 ^ 01000011(C) = 00100111
    • 00100111 ^ 00110010(2) = 00010101
    • 00010101 ^ 01000001(A) = 01010100
    • 01010100 ^ 01000010(B) = 00010110
    • 00010110 ^ 01000011(C) = 01010101
    • 01010101 ^ 01000100(D) = 00010001
    • 00010001 ^ 00100001(!) = 00110000
    • 00110000 ^ 01011101(]) = 01101101
  5. XOR 결과값을 16진수로 변환
    • 01101101 = 0x6D
  6. 다빛 프로토콜 시뮬레이터에서 아스키 프로토콜 전송
    • 아스키 프로토콜 [OK] ![010/C2ABCD!]6D Receive : ![0100!]07

BCC 계산 및 적용 예시2 - 한글

  1. 문자열: ![010/C2가나다!] (한글은 EUC-KR로 인코딩한 값으로 확인)
  2. 각 문자의 ASCII 값 확인
    • ASCII (1Byte)
      • ! = 0x21 (33)
      • [ = 0x5B (91)
      • 0 = 0x30 (48)
      • 1 = 0x31 (49)
      • 0 = 0x30 (48)
      • / = 0x2F (47)
      • C = 0x43 (67)
      • 2 = 0x32 (50)
      • ! = 0x21 (33)
      • ] = 0x5D (93)
    • EUC-KR (2Byte)
      •  = 0xB0 0xA1
      •  = 0xB3 0xAA
      •  = 0xB4 0xD9
  3. ASCII 값을 8비트 2진수로 변환
    • ! (0x21) = 00100001
    • [ (0x5B) = 01011011
    • 0 (0x30) = 00110000
    • 1 (0x31) = 00110001
    • 0 (0x30) = 00110000
    • / (0x2F) = 00101111
    • C (0x43) = 01000011
    • 2 (0x32) = 00110010
    • 가1 (0xB0) = 10110000 / 가2 (0xA1) = 10100001
    • 나1 (0xB3) = 10110011 / 나2 (0xAA) = 10101010
    • 다1 (0xB4) = 10110100 / 다2 (0xD9) = 11011001
    • ! (0x21) = 00100001
    • ] (0x5D) = 01011101
  4. XOR 연산 수행 (초기값: 00000000)
    • 00000000 ^ 00100001(!) = 00100001
    • 00100001 ^ 01011011([) = 01111010
    • 01111010 ^ 00110000(0) = 01001010
    • 01001010 ^ 00110001(1) = 01111011
    • 01111011 ^ 00110000(0) = 01001011
    • 01001011 ^ 00101111(/) = 01100100
    • 01100100 ^ 01000011(C) = 00100111
    • 00100111 ^ 00110010(2) = 00010101
    • 00010101 ^ 10110000(가1) = 10100101
    • 10100101 ^ 10100001(가2) = 00000100
    • 00000100 ^ 10110011(나1) = 10110111
    • 10110111 ^ 10101010(나2) = 00011101
    • 00011101 ^ 10110100(다1) = 10101001
    • 10101001 ^ 11011001(다2) = 01110000
    • 01110000 ^ 00100001(!) = 01010001
    • 01010001 ^ 01011101(]) = 00001100
  5. XOR 결과값을 16진수로 변환
    • 00001100 = 0x0C
  6. 다빛 프로토콜 시뮬레이터에서 아스키 프로토콜 전송
    • 아스키 프로토콜 [OK] ![010/C2가나다!]0c Receive : ![0100!]07