다빛솔루션 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를 이용한 패킷 전송 및 오류 검출 절차
- 시작 문자(
!) 및 종료 문자(])를 포함한 전체 데이터 문자열(![......!])을 ASCII 값으로 확인 - ASCII 값을 8비트 2진수로 변환
- 변환한 모든 값을 XOR 연산수행
- 최종 결과값을 16진수로 변환
- 데이터 끝부분에 추가 하여 전송
- 컨트롤러에서 응답 패킷을 반환하면 해당 패킷은 정상 전송으로 판단
- 컨트롤러의 BCC 계산 결과와 불일치할 경우, 해당 패킷은 적용되지 않음으로써 오류 감지 및 안정성 확보
BCC 계산 및 적용 예시1 - 숫자+영문
- 문자열:
![010/C2ABCD!] - 각 문자의 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)
- ASCII 값을 8비트 2진수로 변환
! (0x21)=00100001[ (0x5B)=010110110 (0x30)=001100001 (0x31)=001100010 (0x30)=00110000/ (0x2F)=00101111C (0x43)=010000112 (0x32)=00110010A (0x41)=01000001B (0x42)=01000010C (0x43)=01000011D (0x44)=01000100! (0x21)=00100001] (0x5D)=01011101
- XOR 연산 수행 (초기값:
00000000)00000000^00100001(!)=0010000100100001^01011011([)=0111101001111010^00110000(0)=0100101001001010^00110001(1)=0111101101111011^00110000(0)=0100101101001011^00101111(/)=0110010001100100^01000011(C)=0010011100100111^00110010(2)=0001010100010101^01000001(A)=0101010001010100^01000010(B)=0001011000010110^01000011(C)=0101010101010101^01000100(D)=0001000100010001^00100001(!)=0011000000110000^01011101(])=01101101
- XOR 결과값을 16진수로 변환
01101101=0x6D
- 다빛 프로토콜 시뮬레이터에서 아스키 프로토콜 전송
아스키 프로토콜 [OK] ![010/C2ABCD!]6DReceive : ![0100!]07
BCC 계산 및 적용 예시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
- ASCII (1Byte)
- ASCII 값을 8비트 2진수로 변환
! (0x21)=00100001[ (0x5B)=010110110 (0x30)=001100001 (0x31)=001100010 (0x30)=00110000/ (0x2F)=00101111C (0x43)=010000112 (0x32)=00110010가1 (0xB0)=10110000/가2 (0xA1)=10100001나1 (0xB3)=10110011/나2 (0xAA)=10101010다1 (0xB4)=10110100/다2 (0xD9)=11011001! (0x21)=00100001] (0x5D)=01011101
- XOR 연산 수행 (초기값:
00000000)00000000^00100001(!)=0010000100100001^01011011([)=0111101001111010^00110000(0)=0100101001001010^00110001(1)=0111101101111011^00110000(0)=0100101101001011^00101111(/)=0110010001100100^01000011(C)=0010011100100111^00110010(2)=0001010100010101^10110000(가1)=1010010110100101^10100001(가2)=0000010000000100^10110011(나1)=1011011110110111^10101010(나2)=0001110100011101^10110100(다1)=1010100110101001^11011001(다2)=0111000001110000^00100001(!)=0101000101010001^01011101(])=00001100
- XOR 결과값을 16진수로 변환
00001100=0x0C
- 다빛 프로토콜 시뮬레이터에서 아스키 프로토콜 전송
아스키 프로토콜 [OK] ![010/C2가나다!]0cReceive : ![0100!]07