erste Schritte in Spin
Re: erste Schritte in Spin
Ok das mit dem XOR ist schon mal gut. Aber was bedeutet z.b. "(data<<8)" also was macht das <<8 mit dem data String? Oder was ist das für eine if abfrage "if crc&$8000"? $weißt auf eine HEX zahl (80 00h = 32768d?) hin soviel ist klar aber was soll das "&". Ich kenn & nur aus VB und da wird es benutzt um z.B. 2 Strings zu verbinden. Ja das sind eigentlich die 2 Sache die ich nicht verstehe.
Re: erste Schritte in Spin
Julian hat geschrieben:Ok das mit dem XOR ist schon mal gut. Aber was bedeutet z.b. "(data<<8)" also was macht das <<8 mit dem data String? Oder was ist das für eine if abfrage "if crc&$8000"? $weißt auf eine HEX zahl (80 00h = 32768d?) hin soviel ist klar aber was soll das "&". Ich kenn & nur aus VB und da wird es benutzt um z.B. 2 Strings zu verbinden. Ja das sind eigentlich die 2 Sache die ich nicht verstehe.
"(data<<8)" ist Bitweises Linksshiften um 8 Bit. Damit werden in diesem Beispiel die hoherwertigen Bits ausgeblendet, da ich die da nicht brauche.
Code: Alles auswählen
Also
|--MSB---| |--LSB--|
%0001 0110 1111 1111 <<8 ..... wird zu
%1111 1111 0000 0000
... wir schieben die MSB's sozusagen aus der Zahl raus und verschieben die LSB 8 Stellen nach links.
Code: Alles auswählen
Also aus
%0001 0110 1111 1111 &
%1100 0001 1100 0000 wird
%0000 0000 1100 0000
Code: Alles auswählen
BitX BitY Ergebnis
0 0 0
0 1 0
1 0 0
1 1 1
Das Ergebnis ergibt wahr oder unwahr .. dementsprechend verzweigt das If in die richtige Routine.
Siehe auch --> http://hive-project.de/wiki/schnipsel:byte1
Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Re: erste Schritte in Spin
So bis auf die CRC Kalkulation funktioniert mein Python Code. Ist auch nicht so wichtig solange sie auf dem HIVE läuft
. War (zumindest für mich) ne Menge Arbeit weil ich nirgends eine gescheite Beschreibung des YMODEM Protokolls gefunden hab (nur diese TXT mit einem Mischmasch aus XMODEM und YMODEM). Doch bevor ich jetzt den xload Code weiter verschandle, werde ich versuchen das ganze selbst neu umzusetzen.
Wenns Probleme gibt, werde ich euch wieder nerven

Wenns Probleme gibt, werde ich euch wieder nerven

Re: erste Schritte in Spin
Mein Kumpel hat mir den Tipp gegeben, dass es sich hierbei um die CRC16 Berechnung handelt. Da habe ich auch eine schöne Funktion in Python gefunden, die ich der oben geposteten vorziehe, da hier die Checksum für das gesamte packet berechnet wird. Doch ich hänge schon beim auslesen der Stringlänge. Da kommen bei mir sehr merkwürdige Zahlen zum vorschein. Hier mal der Python Code:
Und mein SPIN Code dazu:
Doch die Größe wird irgendwie nicht richtig ausgegeben. Was mache ich falsch?
//edit: Und gibts es eine Möglichkeit 2 Werte zurückzugeben. Bei python geht das über tuples oder lists
Code: Alles auswählen
def crc16str(s):
crc = 0
for index1 in range(len(s)):
crc = crc ^ (ord(s[index1]) << 8)
for index2 in range(1, 9):
if crc & 0x8000 != 0:
crc = ((crc << 1) ^ 0x1021)
else:
crc = crc << 1
return crc & 0xFFFF
Code: Alles auswählen
PUB CRC16(packet) | crc, i1, i2, size, n
crc := 0
size := strsize(@packet)
ios.printdec(@size) 'debugging
ios.printnl 'debugging
repeat i1 from 0 to size -1
n := byte[@packet][i1]
crc := @crc ^ (@n << 8)
repeat i2 from 1 to 8
if crc & $8000 <> 0
crc := (@crc << 1) ^ $1021
else
crc := @crc << 1
return crc & $FFFF
//edit: Und gibts es eine Möglichkeit 2 Werte zurückzugeben. Bei python geht das über tuples oder lists
Re: erste Schritte in Spin
Julian hat geschrieben: Und mein SPIN Code dazu:Doch die Größe wird irgendwie nicht richtig ausgegeben. Was mache ich falsch?Code: Alles auswählen
PUB CRC16(packet) | crc, i1, i2, size, n crc := 0 size := strsize(@packet) ios.printdec(@size) 'debugging <--------------------------- ios.printdec(size) ios.printnl 'debugging repeat i1 from 0 to size -1 n := byte[@packet][i1] crc := @crc ^ (@n << 8) repeat i2 from 1 to 8 if crc & $8000 <> 0 crc := (@crc << 1) ^ $1021 else crc := @crc << 1 return crc & $FFFF
//edit: Und gibts es eine Möglichkeit 2 Werte zurückzugeben. Bei python geht das über tuples oder lists
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Re: erste Schritte in Spin
Danke doch leider habe ich anstatt einer elend hohen Zahl jetzt einfach 1
Die betreffenden Zeilen sehen so aus
die CRC wird auch nicht richtig berechnet, weil ja die schleife nur einmal durchläuft.

Die betreffenden Zeilen sehen so aus
Code: Alles auswählen
....
crc := CRC16(@str1)
....
DAT
str1 byte "Hallo",0
Re: erste Schritte in Spin
Probier mal das "size := strsize(@packet)" ohne symbolische Adressierung.
Also "size := strsize(packet)"
Bin mir da aber auch nicht ganz sicher.
Also "size := strsize(packet)"
Bin mir da aber auch nicht ganz sicher.
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Re: erste Schritte in Spin
Ok danke das funktioniert. Doch die CRC ist immernoch falsch. Evtl. ist die crc irgendwas zu groß. Mein aktueller Code:Die erste 3 Werte Stimmen, doch bei den letzten 2 kommen irgendwelche hohen negativwerte raus. So sieht die ausgabe in Pyhton (beim gleichen Code) aus:
>>> crc16str("Hallo")
18432
5023948
1285723362
329145732413
84261307272041
295L <- Final CRC
Sind die Letzten 2 Werte zu groß?
Code: Alles auswählen
PUB CRC16(packet) | crc, i1, i2, size, n
crc := 0
size := strsize(packet)
repeat i1 from 0 to size -1
n := byte[packet][i1]
crc := crc ^ (n << 8)
ios.printdec(crc)
ios.printnl
repeat i2 from 0 to 7
if crc&$8000
crc := (crc << 1) ^ $1021
else
crc := crc << 1
return crc & $FFFF
>>> crc16str("Hallo")
18432
5023948
1285723362
329145732413
84261307272041
295L <- Final CRC
Sind die Letzten 2 Werte zu groß?
Re: erste Schritte in Spin
Klar sind die Werte zu groß das ist ja auch CRC16 und nicht CRC32 benutze 16bit WORD Variablen.
Im amerikanischen Forum findest Du auch CRC16 in Spin kannst das ja mal anschauen.
Grüsse Joshy
Im amerikanischen Forum findest Du auch CRC16 in Spin kannst das ja mal anschauen.
Grüsse Joshy
Re: erste Schritte in Spin
naja in Python funktioniert der Algo super. Das aus dem Amerikanischen Forum hab ich schon gefunden, doch die arbeiten mit Tabellen, was ich gerne vermeiden würde. Naja wenn jemandem noch was einfällt bitte posten. Ich werde mal die Funktion mit Tabellen testen