Hex, BIG-ENDIAN, LITTLE-ENDIAN

Gast #6757373
Lesenswert?

Hallo,

ich möchte mich via TCP zu einer Maschine verbinden und einen Auftrag 
auslösen. Die Verbindung via TCP hat bereits funktioniert, die Maschine 
zeigt eine aktive Verbindung zu meinem Rechner/der Software. Nun muss 
ich ein entsprechendes Telegramm an die Maschine schicken um den Auftrag 
zu starten. Im Handbuch der Maschine ist der Inhalt des Telegramms 
angegeben (siehe gelbe Markierung). Offensichtlich handelt es sich um 
Hex Werte. Nun stehe ich allerdings etwas auf dem Schlauch was die 
Programmierung angeht. Ich nutze Basic und habe die üblichen Befehle zur 
Verfügung wie z.B.

WriteByte
WriteFloat
WriteInt
WriteLine
WriteShort

Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00, 
$0064, $07D0, $2710"
Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige 
Message bei der Maschine an.
Angehängte Dateien:
Gast #6757596
Lesenswert?

Edgar schrieb:

> Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00,
> $0064, $07D0, $2710"
> Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige
> Message bei der Maschine an.

Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen 
String haben will. Was sie haben will, steht in dem Schnipsel Doku, den 
du gepostet hast.

Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du 
schon allein herausfinden, da du uns nicht einmal verraten hast, um 
welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als 
nur eins und die unterscheiden sich voneinander oft ganz erheblich.
Gast #6757813
Lesenswert?

c-hater schrieb:
> Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen
> String haben will. Was sie haben will, steht in dem Schnipsel Doku, den
> du gepostet hast.
>
> Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du
> schon allein herausfinden, da du uns nicht einmal verraten hast, um
> welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als
> nur eins und die unterscheiden sich voneinander oft ganz erheblich.

also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht 
bekannt sein. Ist schon veraltet aber erfüllt seinen zweck und ist halt 
aus alter Gewohnheit am schnellsten für mich.

Stimmt natürlich, die Maschine erwaret keinen String, daher war mein 
Lösungsansatz falsch.

Ich bin nun dazu übergegangen die Hex-Werte in Deizimal umzurchen und 
dann byte weise zu verschicken:

bank=CreateBank (14)

PokeInt bank,1, 34765
PokeInt bank,2, 8
PokeInt bank,3, 12
PokeInt bank,4, 1
PokeInt bank,5, 113
PokeInt bank,6, 8
PokeInt bank,7, 21
PokeInt bank,8, 100
PokeInt bank,9, 2000
PokeInt bank,10, 10000

WriteBytes bank, tcp, 0, 14

Funktioniert leider auch nicht.
Gast #6757870
Lesenswert?

Edgar schrieb:

> also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht
> bekannt sein.

So ist es wohl. Ich glaube mich erinnern zu können, zumindest den Namen 
schonmal gehört oder gelesen zu haben, das ist aber auch schon alles.

> Ist schon veraltet aber erfüllt seinen zweck

Nun, offensichtlich ja wohl doch nicht: Du bekommst dein Problem damit 
nicht gelöst...

> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> PokeInt bank,2, 8
> PokeInt bank,3, 12
> PokeInt bank,4, 1
> PokeInt bank,5, 113
> PokeInt bank,6, 8
> PokeInt bank,7, 21
> PokeInt bank,8, 100
> PokeInt bank,9, 2000
> PokeInt bank,10, 10000
>
> WriteBytes bank, tcp, 0, 14

Ohne jetzt die Doku zu diesem exotischen Basic-Dialekt gelesen zu haben, 
würde ich vermuten, dass dies ungefähr in die richtige Richtung geht, 
aber im Detail noch falsch ist. Insbesondere würde ich mal überprüfen, 
ob es ausser PokeInt noch irgendwelche anderen Poke*-Instruktionen gibt, 
insbesondere vielleicht PokeByte. Damit könnte das dann langsam was 
werden...
#6757901
Lesenswert?

Edgar schrieb:
> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> PokeInt bank,2, 8
> PokeInt bank,3, 12
> PokeInt bank,4, 1
> PokeInt bank,5, 113
> PokeInt bank,6, 8
> PokeInt bank,7, 21
> PokeInt bank,8, 100
> PokeInt bank,9, 2000
> PokeInt bank,10, 10000
>
> WriteBytes bank, tcp, 0, 14

Jetzt gibt es auch die Funktion WriteBytes. Ok.

Bytes und Werte über 255 sind etwas merkwürdig.
(Edit: hab gesehen, dass es PokeInt ist - ist aber auch verkehrt, vor 
allem die Position wird in Bytes angegeben)

(du brauchst wohl undigned 16-Bit Werte. Oft WORD genannt)

Versteht das Basic auch Hexzahlen?
Ein 80x86 und Nachfolger arbeiten mit Little Endian.
Du musst also die Bytes vertauschen. Aber das steht in deinem Bild.

Edit:
#6757918
Lesenswert?

Hi ,

also ich kann mir nicht vorstellen,
das die Tüddels da um den Char richtig sind

"->‘q’<-, $19, $00, $0064, $07D0, $2710"

Mit Basic habe ich vor 30 Jahre das letzt Mal was gemacht und
BlitzBasic , nee keine Ahnung ...
In Python könnte das man heute eher so machen...

msg = b'\x71\x19\x00\x0064\x07d0\x2710'

Gruß Ingo
#6759029
Lesenswert?

Ingo D. schrieb:
> das niemand weiß wie man diesen
> Byte-Stream, ob nun big oder  little Endian, in dem omninösen
> Basic-Dialect versendet.


Edgar schrieb:
> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> WriteBytes bank, tcp, 0, 14

Zuerst sollte das Array groß genug sein: 20 Bytes (Kann man im Bild 
nachzählen)
Dann sollten man auch Bytes in das Array schreiben und auch an Position 
0 beginnen
1
rem 20 Bytes reservieren
2
bank=CreateBank (20)
3
rem $87
4
PokeByte bank,0, 135 
5
rem $CD
6
PokeByte bank,1, 205 
7
..
8

9
WriteBytes bank, tcp, 0, 20
#6759146
Lesenswert?

Genau schrieb:
> Die Dokumentation da auf dem Bild ist einfach schlecht und es fehlen ein
> paar Wörter die alles erklären könnten.

Die Dokumentation ist absolut beispielhaft. Kurz, knapp, mit allem, was 
man wissen muß, und genau auf den Punkt.

Genau schrieb:
> Das sind eher Notizen für Leute
> die das schon gemacht haben oder geschult sind.

Das allerdings könnte so beabsichtigt sein.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren