CRC - 16 MODBUS 원칙 소개, 코드 예제

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

CRC - 16 MODBUS 원칙 소개, 코드 예제

CR C 코 드는 송 신 측 에 의해 계산 되며 , 전송 된 정보 메시 지의 꼬 리에 배치 된다 .정보를 수신 하는 장 치는 정보를 수신 한 CR C 를 다시 계산 하고 , 계산 된 CR C 가 수신 한 CR C 와 일치 하는지 여 부를 비교 하며 , 양 자가 일치 하지 않으면 오류 가 발생 했 음을 나타 냅니다 .
체크 코 드의 계산 다 항 식은 (X 16 + X 15 + X 2 + 1) 입니다 .

CR C 16 코 드의 계산 방법은 다음과 같습니다 .


첫 번째 8 비트 바이 너 리 데이터 (통 신 정보 프레 임 의 첫 번째 바 이트) 를 16 비트 CR C 레 지 스터 의 하 위 8 비트 와 구별 하거나 , 결과를 CR C 레 지 스터 에 넣 는다 .
CR C 레 지 스터 의 내용을 1 비트 (낮 은 비트) 까지 오른 쪽으로 이동 하여 가장 높은 비트 에 0 을 채 우고 오른 쪽으로 이동 한 후 이동 된 비 트를 검사 한다 .
이동 비트 가 0 인 경우 : 단계 3 을 반복 합니다 (다시 오른쪽 이동).
시 프트 아 웃 비 트가 1 인 경우 CR C 레 지 스터 는 다 항 식 A 00 1 (10 10 00 00 00 00 000 1) 과 배 타 적 OR 를 수행 합니다 ; (Mod bus)
오른 쪽으로 8 번 이동 할 때까지 단계 3 및 4 를 반복 하여 전체 8 비트 데이터가 모두 처리 됩니다 .
단계 2 에서 단계 5 까지 의 단계를 반복 하여 통신 정보 프레 임 의 다음 바 이트 의 처 리를 수행 한다 ;
7. 이 통신 정보 프레 임 의 모든 바 이트 는 상기 단계 에 따라 계산 이 완료 된 후 , 얻은 16 비트 CR C 레 지 스터 의 높은 , 낮은 바 이트 를 교환 한다 ;
마지막으로 생성 되는 CR C 레 지 스터 의 내용은 CR C 코드 입니다 .
8.最后得到的CRCレジスタ内容即为:CRC码。

코드

un sig ned int Get CR C 16 (un sig ned char * p tr , un sig ned char len)
{
    un sig ned int 인 덱 스 ;
    un sig ned char cr ch = 0 x FF ; / / 높은 CR C 바 이트
    un sig ned char cr cl = 0 x FF ; / / 낮은 CR C 바 이트
    unsigned char code TabH
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1,  
        0 x 80, 0 x 41, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1,  
        0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1,  
        0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 81  
        0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1,  
        0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x 0  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 81  
        0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 81  
        0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 00 , 0 x C 1,  
        0 x 8 1, 0 x 40, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41,  
        0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40, 0 x 0 1, 0 x C 0, 0 x 80, 0 x 41, 0 x 0 1, 0 x C 0,  
        0 x 80, 0 x 41, 0 x 00 , 0 x C 1, 0 x 8 1, 0 x 40  
    } ;  
    unsigned char code TabL
        0 x 00 , 0 x C 0, 0 x C 1, 0 x 0 1, 0 x C 3, 0 x 0 3, 0 x 0 2, 0 x C 2, 0 x C 6, 0 x 0 6,  
        0 x 0 7, 0 x C 7, 0 x 0 5, 0 x C 5, 0 x C 4, 0 x 0 4, 0 x CC , 0 x 0 C , 0 x 0 D , 0 x CD ,  
        0 x 0 F , 0 x CF , 0 x CE , 0 x 0 E , 0 x 0 A , 0 x CA , 0 x CB , 0 x 0 B , 0 x C 9, 0 x 0 9,  
        0 x 0 8, 0 x C 8, 0 x D 8, 0 x 18, 0 x 19, 0 x D 9, 0 x 1 B , 0 x DB , 0 x DA , 0 x 1 A ,  
        0 x 1 E , 0 x DE , 0 x DF , 0 x 1 F , 0 x DD , 0 x 1 D , 0 x 1 C , 0 x DC , 0 x 14, 0 x D 4,  
        0 x D 5, 0 x 15, 0 x D 7, 0 x 17, 0 x 16, 0 x D 6, 0 x D 2, 0 x 12, 0 x 13, 0 x D 3,  
        0 x 11, 0 x D 1, 0 x D 0, 0 x 10, 0 x F 0, 0 x 30, 0 x 31, 0 x F 1, 0 x 33, 0 x F 3,  
        0 x F 2, 0 x 32, 0 x 36, 0 x F 6, 0 x F 7, 0 x 37, 0 x F 5, 0 x 35, 0 x 34, 0 x F 4,  
        0 x 3 C , 0 x FC , 0 x F D , 0 x 3 D , 0 x FF , 0 x 3 F , 0 x 3 E , 0 x FE , 0 x FA , 0 x 3 A ,  
        0 x 3 B , 0 x FB , 0 x 39, 0 x F 9, 0 x F 8, 0 x 38, 0 x 28, 0 x E 8, 0 x E 9, 0 x 29,  
        0 x EB , 0 x 2 B , 0 x 2 A , 0 x EA , 0 x EE , 0 x 2 E , 0 x 2 F , 0 x EF , 0 x 2 D , 0 x ED ,  
        0 x EC , 0 x 2 C , 0 x E 4, 0 x 24, 0 x 25, 0 x E 5, 0 x 27, 0 x E 7, 0 x E 6, 0 x 26,  
        0 x 22, 0 x E 2, 0 x E 3, 0 x 23, 0 x E 1, 0 x 21, 0 x 20, 0 x E 0, 0 x A 0, 0 x 60,  
        0 x 6 1, 0 x A 1, 0 x 6 3, 0 x A 3, 0 x A 2, 0 x 6 2, 0 x 6 6, 0 x A 6, 0 x A 7, 0 x 67  
        0 x A 5, 0 x 6 5, 0 x 6 4, 0 x A 4, 0 x 6 C , 0 x AC , 0 x AD , 0 x 6 D , 0 x AF , 0 x 6 F ,  
        0 x 6 E , 0 x AE , 0 x AA , 0 x 6 A , 0 x 6 B , 0 x AB , 0 x 6 9, 0 x A 9, 0 x A 8, 0 x 68  
        0 x 7 8, 0 x B 8, 0 x B 9, 0 x 7 9, 0 x BB , 0 x 7 B , 0 x 7 A , 0 x BA , 0 x BE , 0 x 7 E ,  
        0 x 7 F , 0 x B F , 0 x 7 D , 0 x B D , 0 x BC , 0 x 7 C , 0 x B 4, 0 x 7 4, 0 x 7 5, 0 x B 5,  
        0 x 7 7, 0 x B 7, 0 x B 6, 0 x 7 6, 0 x 7 2, 0 x B 2, 0 x B 3, 0 x 7 3, 0 x B 1, 0 x 71  
        0 x 70, 0 x B 0, 0 x 50, 0 x 90, 0 x 9 1, 0 x 51, 0 x 9 3, 0 x 53, 0 x 52, 0 x 9 2,  
        0 x 9 6, 0 x 56, 0 x 5 7, 0 x 9 7, 0 x 55, 0 x 9 5, 0 x 9 4, 0 x 5 4, 0 x 9 C , 0 x 5 C  
        0 x 5 D , 0 x 9 D , 0 x 5 F , 0 x 9 F , 0 x 9 E , 0 x 5 E , 0 x 5 A , 0 x 9 A , 0 x 9 B , 0 x 5 B ,  
        0 x 99, 0 x 5 9, 0 x 5 8, 0 x 9 8, 0 x 8 8, 0 x 48, 0 x 49, 0 x 8 9, 0 x 4 B , 0 x 8 B ,  
        0 x 8 A , 0 x 4 A , 0 x 4 E , 0 x 8 E , 0 x 8 F , 0 x 4 F , 0 x 8 D , 0 x 4 D , 0 x 4 C , 0 x 8 C ,  
        0 x 44, 0 x 8 4, 0 x 8 5, 0 x 45, 0 x 8 7, 0 x 47, 0 x 46, 0 x 8 6, 0 x 8 2, 0 x 42  
        0 x 43, 0 x 8 3, 0 x 41, 0 x 8 1, 0 x 80, 0 x 40  
    } ;
    while (len --) / / 지정 된 길이 의 CR C 계산
    {
        index = cr ch ^ * p tr ++ ;
        crch = crcl ^ TabH
        crcl = TabL
    }
   
    return ((cr ch 8)<< cr cl)|  
}                           

이 함 수는 계산 된 CR C 값을 직접 반환 합니다 .

CRC - 16 MODBUS 원칙 소개, 코드 예제Figure
Related Tags
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

《 “CRC - 16 MODBUS 원칙 소개, 코드 예제” 》 有 10 条コメント

Leave a Reply

Your email address will not be published. Required fields are marked *.