Forum: Mikrocontroller und Digitale Elektronik Mein CRC16 funktioniert nicht?


von gastarbeiter (Gast)


Lesenswert?

unsigned short crc16(signed int16 *daten, unsigned int datenLaenge)
{
unsigned short const g=0x8005;
unsigned short crc_wert = 0x00;
unsigned short d, i, k;
 for (i=0; i<datenLaenge; i++)
  {
  d = *daten++ << 8;
  for (k=0; k<8; k++)
   {
    if ((crc_wert ^ d) & 0x8000)
      crc_wert= (crc_wert << 1) ^ g;
    else
      crc_wert = (crc_wert << 1);
    d <<= 1;
   }
  }
 return(crc_wert);
}

ich lasse ihn über das array "eingepackte_daten" (siehe unten) laufen 
und packe den crcwert am ende meines arrays wieder ein. funktioniert 
aber nicht??????
keine ahnung warum...

#include "CRC.c"

#define   STX   0x02
#define   ETX   0x03
#define    ESC    0x1B
#define    $    0x24  /*Trennzeichen*/


signed int16 daten_einrahmen(signed int16 *eingepackte_daten[], unsigned 
int eingepackte_daten_l)
{
  unsigned short crc=0;
  unsigned int i = 0;
  unsigned int j = 0;
  unsigned int z = 0;
  unsigned int rohdaten_l = 9;
//  unsigned int eingepackte_daten_l;
//  signed int16 eingepackte_daten[15];


  unsigned int16 speed=0x95;
  unsigned int16 height=0x96;
  unsigned int16 direction=0x97;
  signed int16 roll=0x98;
  signed int16 pitch=0x99;
  signed int16 rohdaten[9];


  setup_adc_ports(NO_ANALOGS);
     setup_adc(ADC_OFF);
     setup_psp(PSP_DISABLED);
     setup_spi(FALSE);
     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
     setup_timer_1(T1_DISABLED);
     setup_timer_2(T2_DISABLED,0,1);


  for(z=0; z<=14; z++){
    eingepackte_daten[z]='\0';
  }


  eingepackte_daten[0] = ESC;
  eingepackte_daten[1] = STX;

  rohdaten[0] = speed;
  rohdaten[1] = 0x24;
  rohdaten[2] = height;
  rohdaten[3] = 0x24;
  rohdaten[4] = direction;
  rohdaten[5] = 0x24;
  rohdaten[6] = roll;
  rohdaten[7] = 0x24;
  rohdaten[8] = pitch;

  j = 2;
  for(i=0; i< 9; i++){
    if(rohdaten[i] == ESC){
      eingepackte_daten[i+j] = ESC;
      j++;
      eingepackte_daten[i+j] = ESC;        /*Und füge auch in die 
nächste Stelle ein ESC ein*/
    }
    else
      eingepackte_daten[i+j] = rohdaten[i];
  }

  eingepackte_daten[i+j]  = ESC;
            /*CRC,ESC und ETX werden am Ende des Arrays eingefügt*/
    eingepackte_daten[i+j+1]= ETX;

  eingepackte_daten_l=i+j+2;              /* Berechnung der Länge der 
Daten*/

  crc = crc16(eingepackte_daten,eingepackte_daten_l);
  eingepackte_daten[i+j+2]= crc;            /*Füge mein CRC in mein 
Array*/

  eingepackte_daten_l=i+j+3;              /*Berechnung der entgültigen 
Länge*/

  printf("rohdatenLänge: %i\n\r",rohdaten_l);
        printf("längeEingepackt: %i\n\r",eingepackte_daten_l);

  for(z=0;z<=14;z++){                  /*Gebe Array aus*/
  printf("%i:\ %x\n\r",z,eingepackte_daten[z]);
  }

}

von 3370 (Gast)


Lesenswert?

Ist Singlesteppen als Debug massnahme zu kompliziert ?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

"funktioniert nicht" ist als Fehlermeldung auch maximal unausreichend.


PS: Mein Antigravitationsgenerator funktioniert auch nicht, weiß auch 
grad nicht wrum. Wer kann helfen?

von Jochen M. (taschenbuch)


Lesenswert?

>>"funktioniert nicht" ist als Fehlermeldung auch maximal unausreichend.
>>PS: Mein Antigravitationsgenerator funktioniert auch nicht, weiß auch
>>grad nicht wrum. Wer kann helfen?

Wegstaben,

Stimmt genau.
Allerdings darfst Du hier keine sarkastisch oder satirisch formulierte 
Kritik an den wie immer unzureichenden Infos des OP üben.
Kann gut sein, das Du gleich von einem der Gutmenschen hier ausgebuht 
oder schriftlich abgemahnt wirst.

Immer daran denken, 90% der Besserwisser hier sind Sozialpädagogen, die 
erstmal darüber reden wollen und ausserdem darf man dem armen Jungen 
nicht so  direkt sagen, dass er sich seine Frage zu leicht gemacht hat.


Joche Müller

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.