2019년 5월 21일 • ☕️ 4 min read
start | slave addr | comand code | data content | CRC Check | end |
---|---|---|---|---|---|
10ms 텀으로 구분 | 8bit 범위 0~247 | 8bit 03H, 10H | n*8bit 하단에서 설명 | 16bit 참조 | 10ms 텀을 주고 구분 |
위와 같은 데이터 포맷을 가진다.
요청 필드 명 | 예제 값(16진수) |
---|---|
Slave addr | 01 |
Command code | 03 |
start addr high byte | 00 |
start addr low byte | 06 |
Variable number byte | 00 |
Variable low number byte | 08 |
CRC16 | - |
CRC16 | - |
참고 문서 를 확인해보면 Command code 0x03 은 측정기에서 값을 받아 올 수 있는 코드이고, 주소 0x06~0x07, 0x08~0x09은 각각 X, Y의 외경 값을 가진다. start addr high, low byte 는 16진수 주소를 둘(반?)으로 나눈 값이고, Variable high, low number byte 는 총 몇 바이트를 읽을건지 명시한다. 즉 위 패킷은 0x06 ~ 0x09 까지 총 8byte 를 읽는다. 요약하면 위와 같은 요청은 X, Y 의 외경값 응답을 기대 할 수 있다.
응답 받을 데이터의 범위를 20~40 이라고 가정
응답 필드 명 | 예제 값(16진수) |
---|---|
Slave addr | 01 |
Command code | 03 |
addr 0x06 high byte | 18 |
addr 0x06 low byte | 14 |
addr 0x07 high byte | 1E |
addr 0x07 low byte | 19 |
addr 0x08 high byte | 23 |
addr 0x08 low byte | 1F |
addr 0x09 high byte | 28 |
addr 0x09 low byte | 24 |
CRC16 | - |
CRC16 | - |
Cyclic Redundancy Check 의 준말이며, 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방법 중 하나이다. n 비트의 주어진 정보가 있을때, 이를 k 비트 만큼 자리를 올리고 미리 약속한 k 비트의 키 값으로 나누면 r 비트의 나머지가 남게 된다. 송신측에서는 원래의 정보 비트를 k 비트 자리 올린 것에 r 비트의 나머지를 더해서 n+r 비트의 데이터를 만들어 보낸다. 수신측에서는 수신된 n+r 비트의 데이터를 키 값으로 나누어 보고 나머지가 정확히 0 이 되는지를 검사하면 된다.
위에서 k 가 16 비트이면 CRC-16, 32비트이면 CRC-32 가 된다. 키(제수)) 값으로는 아래를 참고하자.
CRC16 참고자료 를 보면 다양한 crc 종류가 있다.
Modbus, USB, ANSI 등.. 에 이용된다.
아마 IBM 의 룰을 따르지 않을까 생각
CRC-16-IBM(modbus) 에서는 X16 + x15 + x2 + 1 즉 0x8005 를 키(제수)로 이용한다. master 와 server 는 꼭 같은 키를 이용해야한다.
계산 방법은 이곳 을 참조