CRC-Prüfsumme bei konstantem String nicht konstant ??



  • Hallo Leute,
    ich bin dabei von einem String der Art "ABC;irgendwas" eine Checksumme zu erstellen.
    Das Klappt bisweilen auch ganz gut. Die Generierung der Checksumme erhalte ich durch folgenden Algorithmus:

    /*
        Optimized Dallas (now Maxim) iButton 8-bit CRC calculation.
    
        Polynomial: x^8 + x^5 + x^4 + 1 (0x8C)<br>
        Initial value: 0x0
    
        See http://www.maxim-ic.com/appnotes.cfm/appnote_number/27
    
        The following is the equivalent functionality written in C.
        */
    
        uint8_t
        _crc_ibutton_update(uint8_t crc, uint8_t data)
        {
    	uint8_t i;
    
    	crc = crc ^ data;
    	for (i = 0; i < 8; i++)
    	{
    	    if (crc & 0x01)
    	        crc = (crc >> 1) ^ 0x8C;
    	    else
    	        crc >>= 1;
    	}
    
    	return crc;
        }
    

    Die Funktion wird in meinem Programm folgendermaßen verwendet:

    char str[30];
                    uint8_t crc;
    
                    strcpy(str, "DAT");
            	strcat(str, ";");
            	strcat(str, "0,1223:320");
                    str[strlen(str)+1]='\0';
                    Label6->Caption=str;
    
                   	for (uint8_t i=0; i<strlen(str); i++) //erstelle von ABC;XYZ die CRC
    		        crc = _crc_ibutton_update(crc, str[i]);
    
                    Label7->Caption=IntToStr(crc);
    

    Wie man sehen kann, ist der String immer der gleiche, nämlich "DAT;0,1223:320".
    Daraus erhalte ich die Prüfsumme 233. Mir ist aber aufgefallen, sobald ich die Maus aus dem Programmfenster bewege oder auf den blauen Balken des fensters oben die maus halte und gedrückt lasse, sich die CRC verändert. Womit hat das zu tun? Der String bleibt doch der gleiche, wieso aber nicht die CRC?

    Viele Grüße,
    Simon



  • Gelöst: hab vergessen crc vor dem Aufruf des Alorithmus zu initialisieren. Nach dem verlassen der Funktion war warscheinlich noch irgendein Müll drin...
    vG



  • Hast Du einen Code um auf iButtons mit dem CBuilder zuzugreifen? ich hatte das mal versucht aber nicht hinbekommen.
    Falls ja, würdest Du ihn mal posten?

    Gruß myerscola



  • Hi, na klar ist kein Thema:

    typedef signed char        int8_t;
    typedef unsigned char      uint8_t;
    
    typedef short              int16_t;
    typedef unsigned short     uint16_t;
    
    typedef long               int32_t;
    typedef unsigned long      uint32_t;
    
    typedef long long          int64_t;
    typedef unsigned long long uint64_t;
    
    uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data)
    {
    	uint8_t i;
    
    	crc = crc ^ data;
    	for (i = 0; i < 8; i++)
    	{
    	    if (crc & 0x01)
    	        crc = (crc >> 1) ^ 0x8C;
    	    else
    	        crc >>= 1;
    	}
    
    	return crc;
    }
    

    Die Checksumme kannst du aus einem String z.B. so bilden (wie in meinem Beiträgen zuvor):

    nt8_t rs232_getcrc(char* inp) {
    	char str[20];
    	uint8_t crc = 0;
    
    	strcpy( str, inp );
           	for ( unsigned int i = 0; i<strlen( str ); i++) //erstelle von inp die CRC
    	        crc = _crc_ibutton_update(crc, str[i]);
    
           return crc;
    }
    

    Viel Erfolg,
    Simon


Anmelden zum Antworten