Modbus RTU 장치는 프레임 끝에 CRC 두 바이트를 붙입니다. 받는 쪽은 같은 계산을 다시 해서 값이 다르면 프레임을 버립니다. 이 계산은 레지스터 하나에 XOR과 오른쪽 시프트를 반복하는 것뿐입니다.
Modbus CRC-16 레지스터가 바이트마다 XOR과 시프트로 바뀌는 과정을 보여 주는 계산기
1. CRC를 계산할 바이트를 입력하세요 (16진수, 띄어쓰기로 구분)
2. 계산을 진행하세요
[다음 단계]를 누르면 바이트를 XOR하는 단계와 시프트 8번이 하나씩 진행됩니다. 빨간 테두리는 다음 시프트에서 밀려 나갈 맨 오른쪽 비트입니다.
계산 규칙
레지스터를 0xFFFF로 채운 뒤, 바이트마다 같은 일을 반복합니다. 먼저 바이트를 레지스터의 아래쪽 8비트에 XOR합니다. 그다음 레지스터를 오른쪽으로 한 칸 미는 일을 8번 하는데, 밀려 나간 비트가 1이었으면 밀고 나서 0xA001과 XOR합니다.
crc = 0xFFFF
for 각 바이트 b:
crc ^= b
8번 반복:
if crc & 1: crc = (crc >> 1) ^ 0xA001
else: crc = crc >> 1
0xA001은 다항식 0x8005의 비트 순서를 뒤집은 값입니다. 데이터를 가장 낮은 비트부터 처리하므로 다항식도 뒤집어서 씁니다.
보낼 때는 아래 바이트부터
Modbus는 계산한 CRC를 하위 바이트, 상위 바이트 순서로 붙입니다. 레지스터 값이 0xCDC5이면 프레임 끝에는 C5 CD가 붙습니다. 펌웨어에서 CRC가 자꾸 틀린다면 바이트 순서부터 확인해 보세요.