• 学而时习之专栏
  • 温故而知新专栏




  • 变频器MODBUS协议(crc)浅谈





    有很多变频器都支持MODBUS通讯协议,MODBUS通讯协议有二种通讯模式,ASCII模式和RTU模式,两种模式都有CRC校验的,CRC校验是MODBUS协议中的CRC校验.可以保证通讯传输过程中数据的准确性
    判断数据有没有丢失,CRC全称叫(循环校验码).
    下面简单说明它的原理:
    1. 发送方和接收方在通信前,约定好预设整数P.
    2. 将16位寄存器置全1,即是FFFFH
    3。第一个8位的讯息指令与位于16位寄存器将结果存入寄存器内.
    4。又移位一位寄存器,将零填入高位.
    5。检查右移的值,如果是零.将步骤3的新值存入寄存器.
    6。重复4-5,将8位全部运算完成
    7。重复3-6,取下一个8位的讯息指令.直到所有讯息指令运算完成.最后得到的寄存器的值,就是CRC的校验码
    CRC的校验码必须交换放置在讯息指令的校验码中.
    举个例子
    发送方要传输的数据D是10110100共8位,发送方和接收方约定P为101,共三位,冗余位n-k共2位那么F=2n-kDmodP=(22*10110100)mod(101)=(1011010000)mod(101)=00那么传输帧T就是1011010000




    这是一个简单的CRC校验程序:
    #include "stdio.h"
    unsigned char *data;
    unsigned char length;
    unsigned int crc_chk(unsigned char *data, unsigned char length)
    {
    int j;
    unsigned int reg_crc=0xffff;
    while (length--)
    {
    reg_crc^=*data++;
    for(j=0;j<8;j++)
    {
    if(reg_crc&0x01)
    {
    reg_crc=(reg_crc>>1)^0xa001;
    }
    else
    {
    reg_crc=crc_reg>>1;
    }
    }
    }
    return reg_crc;
    }