Forum: PC-Programmierung crc16 in qbasic berechnen


von Sven (Gast)


Lesenswert?

Hallo,

seit einer Woche (am Feierabend) und dieses ganze Wochenende versuche 
ich einen Code in QBasic zu schreiben welcher mir eine CRC16 ermittelt, 
leider ohne Erfolg.
Ich übertrage ein Datenpaket (Header, Parameter, n-Daten, Prüfsumme und 
Paketendekennung) mittels serieller Schnittstelle (QBasic) an einen 
ATmega. Dafür muss ich die Prüfsumme ebenfalls übermitteln, damit komme 
ich nicht klar. Oder besser gesagt: Ich kann die Routine _crc16_update 
aus der Lib "util/crc16.h" nicht in QBasic umsetzten.
Das Problem wird wohl sein, dass QBasic keine uint16_t (unsigned int) 
kennt, ich bin mir ziemlich sicher das mit dem zweierkomplement zu tun 
hat. habe schon viel veruscht komme aber nicht drauf.

für einen Tip oder Denkanstoss wäre ich sehr dankbar.

von Ahem (Gast)


Lesenswert?

Bitte mehr Informationen geben.

>Das Problem wird wohl sein, dass QBasic keine uint16_t (unsigned int)
kennt,
Was läßt Dich das vermuten?

>ich bin mir ziemlich sicher das mit dem zweierkomplement zu tun
hat.
Was läßt Dich das vermuten?

Auf welche Stelle Deinem Code hast Du das Problem eingegrenzt?

Wo ist der Code?

von Sven (Gast)


Lesenswert?

hallo,

mein Problem ist, folgenden C-Code in QBasic umzusetzen.

C-Code:

uint16_t crc16_update(uint16_t crc, uint8_t a)
  {
  int i;
  crc ^= a;
  for (i = 0; i < 8; ++i)
  {
  if (crc & 1)
    crc = (crc >> 1) ^ 0xA001;
  else
    crc = (crc >> 1);
  }
  return crc;
  }

QBasic-Code:

 crc& = crc& XOR a&
  FOR i0% = 0 TO 7
    IF (crc& AND 1) = 1 THEN
      crc& = sr(crc&, 1) XOR &HA001
    ELSE
      crc& = sr(crc&, 1)
    END IF
  NEXT i0%

sieht ja alles ganz simpel aus, geht aber leider nicht.

von Ahem (Gast)


Lesenswert?

Um mich mal selbst zu wiederholen:

>>Das Problem wird wohl sein, dass QBasic keine uint16_t (unsigned int)
>>kennt,
>Was läßt Dich das vermuten?

>>ich bin mir ziemlich sicher das mit dem zweierkomplement zu tun
>>hat.
>Was läßt Dich das vermuten?

>Auf welche Stelle Deinem Code hast Du das Problem eingegrenzt?

von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Das Problem liegt im Code für sr() Dort wird durch 2 geteilt. Dabei 
rundet QBASIC bei ungeraden Zahlen auf. 15/2 = 8 aber sr(&H0f,1) soll 7 
geben.

c: CRC-16 init=0 final=0 http://www.zorc.breitbandkatze.de/crc.html
d: CRC-16 after http://www.lammertbies.nl/comm/info/crc-calculation.html

crc& = &H0
a& = &H31

crc& = crc& XOR a&
PRINT "nach xor", HEX$(crc&)
FOR i0% = 0 TO 7
    IF (crc& AND 1) = 1 THEN
        crc& = ((crc& - 1) / 2&) XOR &HA001&
        PRINT "nach xor A001", HEX$(crc&)
    ELSE
        crc& = crc& / 2&
        PRINT "nach shift right", HEX$(crc&)
    END IF
NEXT i0%
PRINT "Ergebnis =", HEX$(crc&)


nach xor      31
nach xor A001 A019
nach xor A001 F00D
nach xor A001 D807
nach xor A001 CC02
nach shift right            6601
nach xor A001 9301
nach xor A001 E981
nach xor A001 D4C1
Ergebnis =    D4C1

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.