Forum: Compiler & IDEs Zmodem Problem


von Sander R. (degusan)


Lesenswert?

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);

}

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.