Zmodem Problem

OP #985203
Hallo,
ich hab ein großes Problem. Ich soll auf einen AVR (Mega32 -> Mega128 
und AVR GCC) ein Zmodem Protokoll implementieren. Nach einem ausgiebigen 
Studium der offiziellen Doku des Protokolls und nahe zu aller gefundenen 
Google Ergebnisse hatte ich es zuerst mit einem eigenem Code versucht. 
Aus Zeitgründen bin ich dann zum Code von Radu Hristea gewechselt. 
Dieser ist ja für CodeVision verfasst, was kleine Änderungen nötig 
machte.
Nun läuft die Übertragung bis zum senden des erst BinHeaders (HyperTerm 
startet den Datenempfang), dann kommt nach dem Senden des zweiten CRC-16 
Bytes zu der Fehlermeldung „fehlerhaftes Datenpaket“. Daher meine 
Vermutung dass die CRC- Berechnung nicht richtig läuft. Versucht hab ich 
es mittlerweile mit der Berechnung von Radu Hristea, einen Code hier aus 
dem Forum von J.St. (Gast) und einen aus der Doku zum Xmodem Protokoll. 
Alle drei führen zu dem selben Fehler. Beim Code von J.St. (Gast) habe 
ich auch die unterschiedlichsten Generatoren versucht (weiß jemand den 
definitiven Richtigen Zmodem Generator).  Da nun bis Montag alles fertig 
werden soll, meine Anfrage: hat jemand einen funktionierenden Code in 
AVR GCC für Zmodem, Xmodem oder Ymodem Protokoll oder sieht den Fehler 
in der CRC Berechnung.

//---------------------------------------------------------------------- 
-------
word rZModem_crcUpdate(unsigned int crc, unsigned int serialData)
//---------------------------------------------------------------------- 
-------
{   // Please, DO NOT MODIFY ! Any change may cause severe malfunction !
/*asm(
  "ldd   r30, y+2\n"
  "ldd  r31, y+1\n"
  "ld   r27, y\n"
  "eor  r30, r27\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0x0f\n"
  "eor  r30, r26\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0xf0\n"
  "eor  r31, r26\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0xf0\n"
  "lsl  r26 \n"
  "mov  r27, r30  \n"
  "lsr  r27  \n"
  "lsr  r27  \n"
  "lsr  r27  \n"
  "eor  r31, r27  \n"
  "eor  r30, r26 \n"
);*/
unsigned int mask = 0x8811;//0xA001;
  unsigned char i;
  for(i=0;i<8;i++)
  {
    if((crc ^ serialData) & 1) { crc=(crc>>1)^mask; }
    else crc>>=1;
    serialData>>=1;
  }
 /* unsigned char i;
  for(i=8; i>0;i--)
  {
   if (crc & 0x8000)
   {
         crc <<= 1;
         crc += (((serialData<<=1) & 0400)  !=  0);
         crc ^= 0x1021;
     }
     else
   {
         crc <<= 1;
         crc += (((serialData<<=1) & 0400)  !=  0);
     }
  } */
  return (crc);

}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.