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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.