CRC Funktion macht macken, oder bin ich das... ?



  • Hallo,

    ich versuche eine CRC Funktion zu implementieren für den Modbus Protokol. Ich benutze den PI_MBUS_300.pdf file von dem ich auch den C Beispiel übernommen habe. Zum testen benutze ich feste Werte um überhaupt zu sehen ob die CRC Berechnung funktioniert. Orientiere mich anhand http://www.simplymodbus.ca/FC01.htm

    d.h. ich tue senden mit einem Simulationstool für Master

    11 01 0013 0025 0E84
    

    als Antword sende ich fixe Werte,

    11 01 05 CD6BB20E1B
    

    wobei der CRC Wert

    45E6
    

    mittels meiner Funktion ausgerechnet wird und hinten an den gesendeten String drangehängt wird. Mein Problem ist, dass die ersten etwa 20 Datensätze die ich sende den richtigen CRC Wert enthalten, d.h.

    11 01 05 CD6BB20E1B 45E6
    

    danach ändert sich aber der CRC Wert obwohl die Daten

    11 01 05 CD6BB20E1B
    

    immer noch die selben sind. Konnte bis jetzt nich rausfinden wieso.

    Hier mein Code für die CRC Implementierung,

    if(char_received == 1)
    {
    	receive_timeout_1++;
    
            if(receive_timeout_1 == 10001)//if no data received anymore
           	{
    
           	     char_received = 0;
           	     receive_timeout_1 = 0;
                 send_data = 1;
    
           	     LEDG3_OFF();
    
                    s_tx_char[0]=0x11;//feste Werte zum testen
           		s_tx_char[1]=0x01;	
           		s_tx_char[2]=0x05;//lenght of data
           		s_tx_char[3]=0xCD;
           		s_tx_char[4]=0x6B;
           		s_tx_char[5]=0xB2;
           		s_tx_char[6]=0x0E;
           		s_tx_char[7]=0x1B;
    
           		pointer_on_arrays = &s_tx_char[0];//Zeiger zur Berechnun des CRC
    
           		CRC16(pointer_on_arrays, 7);
    
           		s_tx_char[8]=uchCRCHi;//Berechnete Werte hinten dranhaengen
           		s_tx_char[9]=uchCRCLo;
    
           		uchCRCHi=0xFF;
           		uchCRCLo=0xFF;
    
    	        for( i=0; i<10; i++)//Daten versenden
           		{
           			scia_xmit(s_tx_char[i]);
                    }
    memset(s_tx_char,0,MAX_BUF*sizeof(char));//erase buffer,after data was forwarded
    }
    

    CRCFunktion,

    void CRC16(unsigned char *puchMsg, unsigned short usDataLen)
    {
    unsigned uIndex ; // will index into CRC lookup table 
    uchCRCHi = 0xFF ; // high byte of CRC initialized 
    uchCRCLo = 0xFF ; // low byte of CRC initialized 
    
    	for( i=0; i <= usDataLen; i++)
    	{
    	uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC 
    	uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
    	uchCRCLo = auchCRCLo[uIndex] ;
    
    	}//while (usDataLen!=0);  pass through message buffer 
    
    }
    

    CRC Tabellen,

    /* Table of CRC values for high–order byte, reference -> PI_MBUS_300.pdf */
    //const unsigned char modbus_auchCRCHi[] 
    static unsigned char auchCRCHi[] = {
    0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
    0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
    0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
    0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
    0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,
    0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
    0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
    0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
    0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
    0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
    0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
    0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
    0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
    0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
    0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
    0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
    0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
    0x40
    };
    
    /* Table of CRC values for low–order byte */
    //const char modbus_auchCRCLo[]
    static unsigned char auchCRCLo[] = {
    0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,
    0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
    0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,
    0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
    0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,
    0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
    0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,
    0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
    0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,
    0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
    0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,
    0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
    0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,
    0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
    0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,
    0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
    0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,
    0x40
    };
    

    Wie gesagt, weiss momentan nicht wieso sich der CRC Wert ploetzlich nach etwa 20 Berechnungen plötzlich ändert. Falls einer den Fehler sieht oder einen Tipp hat...

    Danke & Gruß

    Dennis


Anmelden zum Antworten