C - Anfängerfrage

Gast #5469132
Lesenswert?

Einen wunderschönen guten Abend,
1
uint8_t crc8 ( uint8_t inCrc , uint8_t inData )      
2
{
3
  uint8_t   i;
4
  uint8_t   data;
5

6
  data = inCrc ^ inData;
7

8
  for ( i = 0; i < 8; i++ )
9
  {
10
    if (( data & 0x80 ) != 0 )
11
    {
12
      data <<= 1;
13
      data ^= 0x07;
14
    }
15
    else
16
    {
17
      data <<= 1;
18
    }
19
  }
20
  return data;
21
}
22

23

24
void buildCmd( uint8_t addr , uint32_t cmd , bool crcEn )    
25
{
26
  uint8_t frameLow  []  = { 0xFF , addr    , ( cmd & 0x000000FF ) , ( ( cmd & 0x0000FF00) >> 8 ) , 0x00 };
27
  uint8_t frameHigh  []  = { 0xFF , addr + 1 , ( ( cmd & 0x00FF0000 ) >> 16 ) , ( ( cmd & 0xFF000000) >> 24 ) , 0x00 };
28
  
29
  uint8_t x = 0;
30
  uint8_t result = 0;
31
  
32
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
33
  {
34
    result = crc8( frameLow[4] , frameLow[x] );
35
  }
36
  frameLow[4] = result;
37
  cmdOut( frameLow , ( 4 + crcEn ) );
38
  
39
  
40
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
41
  {
42
    result = crc8( frameHigh[4] , frameHigh[x] );
43
  }
44
  frameHigh[4] = result;
45
  cmdOut( frameHigh , ( 4 + crcEn ) );
46
}


Wieso klappt die Übergabe hier nicht? Kann es was damit zu tun haben das 
es das gleiche Array ist? Bekomme jedesmal "0" raus beim CRC
1
result = crc8( frameLow[4] , frameLow[x] );

Danke schon mal für die nette Erklärung (:
Gast #5469156
Lesenswert?

Du hast zweimal dieses Konstrukt:

for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
  {
    result = crc8( frameLow[4] , frameLow[x] );
  }

result ist kein Array, daher scheint diese Schleife völlig sinnlos.
Steht die Funktion crc8 noch im .lss-File oder wurde die wegoptimiert?
Gast #5469159
Lesenswert?

Felix schrieb:
> Du hast zweimal dieses Konstrukt:
>
> for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
>   {
>     result = crc8( frameLow[4] , frameLow[x] );
>   }
>
> result ist kein Array, daher scheint diese Schleife völlig sinnlos.
> Steht die Funktion crc8 noch im .lss-File oder wurde die wegoptimiert?

Das passt schon alles.
Wenn ich jetzt anstatt den oben erwähten Code nehmen..
1
> for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
2
>   {
3
>     frameLow[4] = crc8( frameLow[4] , frameLow[x] );
4
>   }

Kommt immer nur "0" raus.
Moderator Persönliche Seite #5469165
Lesenswert?

Sonya W. schrieb:
> Wieso klappt die Übergabe hier nicht? Kann es was damit zu tun haben das
> es das gleiche Array ist? Bekomme jedesmal "0" raus beim CRC

Ich nicht.

Damit ich das Programm überhaupt übersetzen konnte, habe ich die Aufrufe 
von cmdOut() auskommentiert, da diese Funktion von Dir nicht angegeben 
wurde. Anschließend habe ich unter jedem Aufruf von crc8() per printf() 
den Wert von result ausgeben lassen.

Ausserdem noch folgende includes hinzugefügt:
1
#include <stdio.h>
2
#include <stdint.h>
3
#include <stdbool.h>

Dann noch main() hinzugefügt:
1
int main ()
2
{
3
    buildCmd (10, 330, 1);
4
    return 0;
5
}

Nach Ausführen wird das folgende ausgegeben:
1
243
2
54
3
241
4
7
5
0
6
243
7
49
8
0
9
0
10
0

Von "jedesmal 0" kann also keine Rede sein.

Bitte gib ein vollständig kompilierbares Programm an, mit dem man das 
nachvollziehen kann. Bruchstücke helfen hier offenbar nicht.
Gast #5469169
Lesenswert?

> Nach Ausführen wird das folgende ausgegeben:243
> 54
> 241
> 7
> 0
> 243
> 49
> 0
> 0
> 0
>
> Von "jedesmal 0" kann also keine Rede sein.

Mein Fehler.
framex[4], dort sollte die CRC drin stehen. Das tut sie aber nicht wie 
man sieht..
Gast #5469170
Lesenswert?

Sonya W. schrieb:
> Kommt immer nur "0" raus.

Die crc8 Funktion erwartet als Eingangs-Parameter inCrc, das Ergebnis 
der crc8 von der vorhergehenden Stelle. Sonst rechnest du jedes mal von 
vorne...
1
  result = frameLow[4];
2
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
3
  {
4
    result = crc8( result , frameLow[x] );
5
  }
Gast #5469177
Lesenswert?

Hallo Sonya,

da hast du ja einen super kommentierten Code gebastelt. Da erkennt man 
sofort, was er machen soll.

Sonya W. schrieb:
> Kommt immer nur "0" raus.

Vielleicht schiebst du ja immer 0 rein?

Was steht den vor Ausführung genau in framelow[]?
Hast du keinen Debugger?
Geh doch die Ausführung schrittweise durch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren