Hallo Zusammen.
Um direkt Beschimpfungen oder ähnlichem vorzugreifen: Ich kenne mich
nicht aus und benötige nur ein Hilfebeispiel, denn die Beschreibung ist
für mich als nicht-Programmierer und nicht-Mikrocontroller-Mensch sehr
unverständlich. Den Rest bekomme ich hin, hoffe ich.
Es geht um eine 8-Kanal Relais-Karte, die über RS232 gesteuert wird.
In der Anleitung steht folgendes:
(ZITAT)
Befehlsfolge:
Um einen Befehl auszuführen muss die richtige Befehlsfolge der K8056
übertragen werden.
Eigentlich sieht solch eine Befehlsfolge so aus:
1. CHR$ (13)
2. Kartenadresse (1...255)
3. Befehl
4. Adresse (1...255) oder Relaisnummer ('1'..'9' ASCII)
5. 'checksum' Summe prüfen (2-Komplement der Summe der 4 vorigen Bytes +
1)
Befehle:
'S' : Relais einstellen. 'S'-Befehl soll durch Relais # '1' bis '8'
gefolgt werden.
'C' : Relais löschen. ...(ich kürze das hier mal ab)...
(ZITAT ENDE)
Und jetzt steh ich da und nix tut sich ...
Was müsste ich zum Beispiel schreiben für 'Relais 1 an'? (In HEX) Den
Rest verstehe ich dann und könnte es herleiten.
Danke schonmal im voraus.
Michael schrieb:> Ich hätte nichts gegen konstruktive Beiträge, Danke.
Also mein Beitrag war konstruktiv. Er ist extra für Leute die schnelle
Hilfe fordern.
DU hast doch schon alles geschrieben:
sende
1. CHR$ (13)
2. Kartenadresse (1...255)
3. Befehl: hier wohl 'S'
4. Adresse (1...255) oder Relaisnummer ('1'..'9' ASCII):hier wohl '1'
5. 'checksum' Summe prüfen (2-Komplement der Summe der 4 vorigen Bytes +
1)
Also die Anleitung ist sehr schwammig was Befehlslänge und Formatierung
angeht.
Ich würde es erst mal mit:
0x13 0x01 0x53 0x31 0x66
versuchen.
Sind aber viele Vermutungen eingeflossen.
SuperPCFan schrieb:> Also die Anleitung ist sehr schwammig was Befehlslänge und> Formatierung> angeht.>> Ich würde es erst mal mit:>> 0x0D 0x01 0x53 0x31 0x6C>> versuchen.>> Sind aber viele Vermutungen eingeflossen.
Michael schrieb:> 'checksum' Summe prüfen (2-Komplement der Summe der 4 vorigen Bytes + 1)Philipp L. schrieb:> 5. 'checksum' -> 0x5332
Ich tippe eher, dass die Checksum auch ein einziges Byte ist und damit
0x6F ist...
0x6F deshalb, weil 0x100-0x92=0x6E ist. Und 1 drauf gibt die 0x6F.
egberto schrieb:> Das Demo von Vellmann läuft?
Die Software finde ich nicht. Die Homepage ( www.vellemann.be ) ist auch
nicht mehr da... Hast Du die Software vielleicht?
SuperPCFan schrieb:> Ich würde es erst mal mit:>> 0x13 0x01 0x53 0x31 0x66>> versuchen.
Das klappt leider nicht. Aber es ist schön zu merken, dass ich nicht der
einzige bin, der das nicht aus dem eff eff hin kriegt mit der Anleitung
;-)
bis jetzt noch NICHT FERTIG ;-)
philip's angabe noch probieren...
Michael schrieb:> Was müsste ich zum Beispiel schreiben für 'Relais 1 an'? (In HEX) Den> Rest verstehe ich dann und könnte es herleiten.
0x0D - 0x01 - 0x53 - 0x31 - 0x6F
Eine Sekunde warten, dann
0x0D - 0x01 - 0x43 - 0x31 - 0x7F
senden.
Michael schrieb:> Und jetzt steh ich da und nix tut sich ...
Und was hast du gemacht was zu diesem Ergebnis führte?
Du musst wahrscheinlich schreiben:
0x0d = CHR$13
0x01 = Kartenadresse, Annahme von mir, ich kenne ja nicht deine
Einstellungen
0x53 = S
0x01 = Adresse 1, ev. auch ASCII '1', wäre dann 0x31
0x9E = Zweierkomplement der Summe 0x0d+0x01+0x53+0x01, muss geändert
werden, wenn Relaisadresse als 0x31 gesendet werden muss
Du musst die Kombinationen aus Hex-angaben, Dezimalangaben, Adressen und
den passenden Checksummen durchspielen.
Bei so einer Anleitung raten wir genauso wie du.
HildeK schrieb:> 0x9E = Zweierkomplement der Summe 0x0d+0x01+0x53+0x01
Das Zweierkomplement der Summe 0x0d+0x01+0x53 = 0x92
Und noch 1 drauf 0x6E+0x01 = 0x6F
Was ich mich da frage: warum machen sich die Leute bei der Prüfsumme
eigentlich immer das Leben so umständlich schwer? Ich würde einfach die
Summe der vorigen Bytes senden.
Oder nur das Zweierkomplement, dann ist die Summe über alle 5 Bytes 0.
Aber das +1 hier ist ein unnötiger Knoten im Hirn...
Vielen Dank alle zusammen!
Ich hab geschaltet. freude
Das mit der checksumme muss ich mir noch beibringen, dann wird der rest
schon ... ;-)
Der Sieger:
0x0D 0x01 0x53 0x31 0x6E
Danke.
Weil bei Prüfsummen immer Komplexität gegen Sicherheit arbeitet.
Will man einfache Berechnungen oder möglichst viele Fehlerfälle
erschlagen?
Beides geht nicht.
Jede Rechenoperation macht andere Fehler erkennbar.
Jede Rechenoperation die man weglässt, lässt die entsprechenden Fehler
unentdeckt.
SuperPCFan schrieb:> Weil bei Prüfsummen immer Komplexität gegen Sicherheit arbeitet.
Das ist aber schon "sich selber Sand in die Augen streuen".
> Jede Rechenoperation macht andere Fehler erkennbar.> Jede Rechenoperation die man weglässt, lässt die entsprechenden Fehler> unentdeckt.
Was bietet mir hier das +1 ausser der Sicherheit, dass das irgendwann
mal einer vergisst? Warum multiplizert man dann das Ergebnis der
Prüfsumme nicht noch mit 7 und zieht daraus die Wurzel?
Ich hätte gesagt: summiere alle übertragenen Bytes auf, und wenn nicht 0
rauskommt, dann ist es ein Fehler.
Michael schrieb:> wieso hat der dann mit 0x6E auch geschaltet? grübel
Wenn er das tut, schaltet der vermutlich auch mit jeder beliebigen
Prüfsumme, weil die empfängerseitig aus Komplexitätsgründen gar nicht
implementiert ist...
Vielen Dank Euch allen. Wenn ich mal wieder was Controller-mässiges
brauche, komm ich gerne wieder. Ich brauche das nur zu selten (bis
eigentlich gar nicht) um mich mit der Materie auseinander zu setzen.
Kann als gelöst geschlossen werden.
Danke.
Hier.
So etwas von Sch..site habe ich lange nicht erlebt.
Michael schrieb:> Der Sieger:>> 0x0D 0x01 0x53 0x31 0x6E
Mit Sicherheit nicht.
Weil:
0x0D+0x01+0x53+0x31 = 0x92
2-er Komplement = 0x6E
+1 = 0x6F
Andersrum:
0x0D+0x01+0x53+0x31 = 0x92 +1 = 0x93
2-er Komplement = 0x6D
Wo kommt denn noch einmal +1 im zweitem Beispiel ?
Richtig ist entweder
Beitrag "Re: RS232 Newbie braucht schnelle Hilfe"
oder 0x6D
Oder das, was du oben aufgeführt hast, stimmt nicht.
Oder es wird jede beliebige Prüfsumme angenommen.
Michael schrieb:> Der Sieger:>> 0x0D 0x01 0x53 0x31 0x6E
Damit geht's?
OK, dann ist es nur das Zweierkomplement ohne irgendwelche weitere
Additionen.
Vielleicht hätte stehen sollen: Einerkomplement + 1 ...
Lothar M. schrieb:> Ich hätte gesagt: summiere alle übertragenen Bytes auf, und wenn nicht 0> rauskommt, dann ist es ein Fehler.
und so war es dann ja auch
Hallo,
wie kommunizierst Du denn hardwaremäßig per Kabel mit der Relaiskarte?
Per Softwarehandshakes oder Hardwarehandshakes?
Bei Softwarehandshakes reicht ein 3 aderiges Kabel. Also Masse, RX und
TX.
Bei Hardwarehandshakes musst Du mindestens 4 Adern haben. Also Masse,
RX, TX und DTR.
Wichtig hierbei könnte sein, dass der Rechner der die Daten zur
Relaiskarte sendet, zuerst das DTR-Bit (Data-Terminal-Ready-Bit) an die
Relaiskarte senden muss, bevor die Relaiskarte mit dem Rechner
kommunizieren kann.
Stimmen denn die übrigen Parameter wie Baudrate, Datenbit, Stopbit und
Parität? Falls nicht, ist eine Kommunikation ebenfalls nicht möglich.
MfG. Zeinerling
guest schrieb:> checksum = (255 - ((((13 + address + Asc("S") + Asc("1")) / 256) -> Int((13 + address + Asc("S") + Asc("1")) / 256)) * 256)) + 1
Was für ein Schwachsinn.
> messagestring = Chr$(13) & Chr$(address) & "S1" & Chr$(checksum)> messagestring = messagestring & messagestring> messagestring = messagestring & messagestring> comm.Output = messagestring
Und das ist noch schwachsinniger.
> Hier noch ein Auszug aus dem PDF:For wired operation, the instruction> sequence needs to be sent at least twice.
Und das ist absoluter Wahnsinn.