CRC16 Berechnung (XModem)

OP #5943039
Lesenswert?

Hallo,
ich benötige die Berechnung nach CRC16 XModem und habe dazu folgendes 
Modul in C gefunden.
Leider kann ich aber kein C.
Kann mir jemand dieses nach Luna-AVR übersetzen? oder in einen anderen 
Basic-Dialekt (VBA).
Gruß
Angehängte Dateien:
Gast #5943053
Lesenswert?

Wolfgang Z. schrieb:
> Wahrscheinlich!
> Und vielen Dank für die "nette" Antwort.

Wenn Du nett willts dann geh zur Oma.
Wenn du ne passende CRC willst, dann lerne wie man in einen Code den 
Algorithmus aus einem anderen Coder verpflanzt.

So eine CRC-Summe ist doch nix weiter als XOR und bit shift, das kann 
auch BASIC:
http://lua-users.org/wiki/BitwiseOperators

Für Doofe, gefunden mit:
https://www.google.com/search?client=firefox-b-d&q=lua+BASIC+XOR+bit+shift&oq=&aqs=
Gast #5943078
Lesenswert?

jep, ohne Google würden hier einige ziemlich blöd aus der Wäsche gucken.
DIe haben nie gelernt wie eine soziale Gemeinschaft funktioniert...sind 
halt oft Nerds...die nie Freunde hatten und sich immer alleine 
durchboxen mussten.
Also nicht verärgert über die sein, sie können nichts dafür:-( 
Eigentlich sollte man ihnen eher helfen, abr das ist oft zu spät, sie 
wollen gar kein Sozialverhalten mehr..es fehlt die Grundlage im Gehirn, 
dieser bildet sich bis 25 Jahre aus, danach haben sie es schwer.
Ist auch nichts anderes als eine geistige Behinderung und daher sollte 
man auch nicht über solche Menschen herziehen
(Firma: fritzler-avr.de) #5943081
Lesenswert?

Alex D. schrieb:
> Wofür dann ein Forum wie mikrocontroller.net, wenn man eh nur Google
> fragen darf

Er fragt ja nicht wie er es machen könnte sondern sagt, dass es einer 
für ihn machen soll.
Dementsprechend weht dann eben auch der Wind.

Hilfe zur Selbsthilfe ja.
Hilfe zum Faullenzen gibts hier eben nicht.

Vor allem Code als Bild anfügen, gehts noch?

Vor allemw as wird denn an dem Code nicht verstanden?
zB der VBA Schiebeoperator sieht 1zu1 aus wie in C.
Ansonsten ist die Syntax auch nicht so anders, der TO hats also nicht 
mal versucht.
Gast #5943084
Lesenswert?

Gegeg J. schrieb:
> jep, ohne Google würden hier einige ziemlich blöd aus der Wäsche gucken.
> DIe haben nie gelernt wie eine soziale Gemeinschaft funktioniert...sind
> halt oft Nerds...die nie Freunde hatten und sich immer alleine
> durchboxen mussten.

Andererseits gibt es hier häufig Fragen, die man durch einfaches Googlen 
innerhalb kürzester Zeit beantwortet bekommt.

Ich stimme zu, dadd die Antwort von "Suchet und ihr werdet finden 
(Gast)" war nicht wirklich freundlich formuliert war. Sowas kann man 
netter rüberbringen.
Und wenn man genervt ist, kann man sich etwaige Antworten auch einfach 
sparen.
Gast #5943086
Lesenswert?

"Vor allem Code als Bild anfügen, gehts noch?"

komisch in etlichen anderen Foren machen das die Leute sehr gerne und 
helfen..nur hier sind halt die gescheiterten Nerds die frustriert alles 
selber lernen mussten, da ihnen nie Freunde geholfen haben.
Und sie zu hause eine dicke, wenig attraktive Freundin haben oder gar 
keine..
#5943125
Lesenswert?

Mw E. schrieb:
> Vor allemw as wird denn an dem Code nicht verstanden?
> zB der VBA Schiebeoperator sieht 1zu1 aus wie in C.
> Ansonsten ist die Syntax auch nicht so anders, der TO hats also nicht
> mal versucht.

D.h. du könntest ihm problemlos helfen, möchtest aber nicht ...

Warum verschwendest du dann deine wertvolle Zeit mit nicht hilfreichen 
Antworten ?
OP #5943153
Lesenswert?

Ich brauche keinen "Dummen" der meine Arbeit macht.
Natürlich habe ich es schon selbst versucht, aber nicht hinbekommen.
Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.
Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
schon eine fertige Routine dafür hat.
Warum das Rad nochmal erfinden!
Gast #5943161
Lesenswert?

Wolfgang Z. schrieb:
> Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
> schon eine fertige Routine dafür hat.
> Warum das Rad nochmal erfinden!

Und genau deswegen kommt dann gerne der Hinweis zu googlen.
Die Wahrscheinlichkeit, dass jemand solchen Algorithmus in Luna-AVR hier 
im Forum schon erstellt hat, ist geringer, als im restlichen Internet.

Wolfgang Z. schrieb:
> Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.

Die du uns ja wunderbar vorenthalten hast.
In Foren sollte man nach Hilfe fragen, und nicht nach fertigen Lösungen.
#5943170
Lesenswert?

STK500-Besitzer schrieb:
> Die Wahrscheinlichkeit, dass jemand solchen Algorithmus in Luna-AVR hier
> im Forum schon erstellt hat, ist geringer, als im restlichen Internet.

Genau so siehts wahrscheinlich aus. Ich würde mich mit der Frage an die 
kleine versprengte Enklave wenden in der die 12 Programmierer 
eingesperrt sind die das tatsächlich selbst verwenden, jeder von denen 
wird in der Lage sein das im Handumdrehen zu portieren. Hier jedoch ist 
es eher unwahrscheinlich denn um funktionsfähige Code abzuliefern müsste 
man ja erstmal selbst eine funktionierende Umgebung für dieses exotische 
Luna-Plattform griffbereit haben und die Sprache beherrschen, und wer 
hat das schon?
(Firma: fritzler-avr.de) #5943177
Lesenswert?

Wolfgang Z. schrieb:
> Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
> schon eine fertige Routine dafür hat.

Das steht da oben aber nicht ;)
Da steht:
Wolfgang Z. schrieb:
> Kann mir jemand dieses nach Luna-AVR übersetzen?

Also eine Handlungsanweisung und nicht "hat da wer für mich?".

Wolfgang Z. schrieb:
> Natürlich habe ich es schon selbst versucht, aber nicht hinbekommen.
> Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.

Sowas enthält man dann aber beim Eröffnugspost nicht vor, sondern fragt 
wieso das nicht funktioniert.
Gast #5943259
Lesenswert?

"In Foren sollte man nach Hilfe fragen, und nicht nach fertigen 
Lösungen."

aha...in anderen Foren hat man dazu eine weniger Einzelngänger 
Meinung...
So  eine meinung haben irgendwie die Typischen C 
Programmierer...offensichtlich frustriert C dauerhaft
Gast #5943266
Lesenswert?

Gegeg J. schrieb:
> aha...in anderen Foren hat man dazu eine weniger Einzelngänger
> Meinung...

Dann bin ich lieber Einzelgänger, der nicht noch irgendwelche Leute mit 
durchs Studium schleppen musste, die nur konsumiert haben.

> So  eine meinung haben irgendwie die Typischen C
> Programmierer...offensichtlich frustriert C dauerhaft

Wenn du meinst.
Hast du schon was zur Problemlösung statt weiterer Erderwärmung durch 
die Produktion unnütiger, heißer Luft beigetragen?
Gast #5943286
Lesenswert?

Die Frage ist eher... Warum programmiert man eigentlich wenn man 
überhaupt keinen Bock aufs programmieren hat? Es gibt genug andere 
Hobbys die man sich suchen kann.
Das verstehe ich wirklich nicht wenn ich hier diese Art von Fragen lese.
(Firma: Vescomp) #5943364
Lesenswert?

Wolfgang Z. schrieb:
> Okay, habe ich verstanden!
> Trotzdem Danke für die Hinweise.
> Bin nun mal nicht der Foren-Experte.

 Aber du hast dir nicht mal die Mühe gemacht Source abzutippen oder dein
 mißglücktes Versuch in Basic anzuhängen, statt dessen ein .PNG und
 Erklärungen wie du es versucht hast.

 Btw. das C-Programm ist auch nicht optimal.
1
     if(crc & 0x8000) {
2
        crc <<= 1;          //*** Shift wenn Richtig
3
        crc ^= 0x1021;
4
     } else {
5
        crc <<= 1;          //*** Shift wenn Falsch auch
6
     }

 Versuch es mal hiermit:
1
 crc = partial
2
 For i = 0 To len - 1
3
    c = ((crc>>8) And &HFF)
4
    c = c Xor *ptr
5
    ptr += 1
6
    crc = (CUShort(c)<<8) Or (crc And &HFF)
7
    For j = 0 To 7
8
       crc <<= 1
9
       If crc And &H8000 Then
10
          crc = crc Xor &H1021
11
       End If
12
    Next j
13
  Next i
14
  Return crc

 Und das nächste Mal Source als Datei oder Text mitschicken, auch
 dein (angebliches) C=>Basic Versuch.
 Wetten, daß die Antworten dann ganz anders aussehen?

 P.S.
 Aus dem Kopf auf die schnelle, nicht sicher ob das so richtig ist.
 Pointer in Basic ist VarPtr, so weit ich mich erinnere...
Gast #5943827
Lesenswert?

Da das BASIC-beispiel aus dem ersten von mir genannten Link:

1
REM crc%   = incoming CRC
2
REM start% =>start of data
3
REM num%   = number of bytes
4
:
5
FOR addr% = start% TO start% + num% - 1
6
  crc% = crc% EOR 256* ?addr%                   :REM EOR with current byte
7
  FOR bit% = 1 TO 8                            :REM Loop through 8 bits
8
    crc% = crc% + crc%                           :REM Move crc% up one bit
9
    IF crc% AND &10000 : crc% = crc% EOR &11021  :REM EOR with XMODEM polynomic
10
  NEXT bit%                                  :REM Ensuring CRC remains a 16-bit value
11
NEXT addr%
12
:
13
REM crc% = outgoing CRC

Bit shifts sind durch Multiplikationen mit Zweierpotenzen realisiert, 
das EOR steht wohl für XOR also exklusiv-OR. Details zum benutzen 
Basic-Dialekt finden sich dort: 
http://www.bbcbasic.co.uk/bbcwin/manual/bbcwin2.html#operators

Es sollte doch nicht schwer sein das durch VBA zu prügeln, zumal in den 
Kommentaren die jeweilige Operation in plain english genannt wird.
Im Anhang derselbe Code als Textdatei.
Angehängte Dateien:
(Firma: Vescomp) #5943912
Lesenswert?

Wolfgang Z. schrieb:
> Hallo Uwe,
>
> vielen Dank.
> Dieser Teil zeigt mir, dass es sich um das richtige Polynom handelt:
> Werde ich gleich morgen nach LunaAVR überführen und dann testen.

 Deine Antwort zeigt mir, daß du überhaupt nichts kapiert hast.
 Und auch, daß du Luna nicht kannst.
 Luna hat genau dieselben Shift und logishe Operatoren wie C.
 Also hättest du die meisten Zeilen einfach abschreiben können.

 Und der Beispiel in Bascom ist so etwas von retarded...
 Es wird unnötig eine Funktion kreiert und aufgerufen...
 In dieser Funktion werden lokalen Variablen unnötig Werte zugewiesen...
 Überall wird mit Long gerechnet, anstatt einfach bit 15 zu prüfen...
 Function CRC16 wird as Integer deklariert, d.h. von -32,768 bis +32,767
 Bascom hat auch Word als Data type.
 usw. usw.

 Ich habe es nicht ausprobiert, kann aber wetten, daß der Beispiel in
 Bascom falsche Werte liefert.
#5943977
Lesenswert?

Marc V. schrieb:
> Wolfgang Z. schrieb:
>> Hallo Uwe,
>>
>> vielen Dank.
>> Dieser Teil zeigt mir, dass es sich um das richtige Polynom handelt:
>> Werde ich gleich morgen nach LunaAVR überführen und dann testen.
>
>  Und der Beispiel in Bascom ist so etwas von retarded...
>  Es wird unnötig eine Funktion kreiert und aufgerufen...
>  In dieser Funktion werden lokalen Variablen unnötig Werte zugewiesen...
>  Überall wird mit Long gerechnet, anstatt einfach bit 15 zu prüfen...
>  Function CRC16 wird as Integer deklariert, d.h. von -32,768 bis +32,767
>  Bascom hat auch Word als Data type.
>  usw. usw.
>
>  Ich habe es nicht ausprobiert, kann aber wetten, daß der Beispiel in
>  Bascom falsche Werte liefert.

Da wettest Du falsch.
Im Beispiel geht es um das WIE und nicht um das OPTIMAL.

Und das es in BASCOM gewisse Beschränkungen gibt im Syntax ist halt so, 
damit sieht der Code halt ein bissel anders aus - Du musst ja BASCOM 
nicht verwenden.
OP #5944518
Lesenswert?

Hallo Uwe,
Danke für den Hinweis.
Diese Seite hat mich auf eine Idee gebracht (und schon umgesetzt).
Ich bestimme die CRC16-Werte mittels eines Online-Calculators:
https://crccalc.com/
Dann habe ich alle benötigten Prüfsummen als Konstante in mein Programm
eingefügt und hänge diese dann jeweils an die Befehle für das UART 
SD-Karten-Modul.
Das funktioniert ohne Probleme und ich kann die Daten von der SD-Karte 
lesen.
Nachteil: die gesendeten Byte-Folgen dürfen nicht geändert werden!
Klar, nicht gerade die eleganteste Lösung, aber damit komme ich jetzt in 
meinem Projekt weiter.

Gruß
Wolfgang
Gast #5944552
Lesenswert?

Wolfgang Z. schrieb:
> Nachteil: die gesendeten Byte-Folgen dürfen nicht geändert werden!
> Klar, nicht gerade die eleganteste Lösung, aber damit komme ich jetzt in
> meinem Projekt weiter.

Vielleicht hilft dir ein Tabellenbasierter CRC weiter. Hier hatte einer 
ein ähnliches Problem:
Beitrag "CRC 8 Probleme bei cyclic redundancy check"

Also erst den Tabellengenerator aus dem "Painless Guide To CRC" bemühen,
https://www.google.com/search?q=painless+guide+to+crc
dann mit Testvektoren aus https://www.google.com/search?q=autosar+crc 
bzw. auch deine SD-Kartenbefehle testen.
Viel Erfolg!

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