Enhanced protocoll RS232

Hallo,

Ich stehe vor der Aufgabe ein Spektrometer über RS232 einzulesen, verwende dazu JAVA. Mit dem Datenaustausch über die serielle Schnittstelle hab ich ein paar Erfahrungen gemacht, sogar ein paar positive

Zu meinem Problem: Das Gerät verwendet ein etwas trickreiches Protokoll. Ich habe zwar eine Verbindung zu dem Messgerät und kann auch Daten einlesen (nämlich die, die es nach dem Einschalten automatisch sendet) aber ich schaffe es einfach nicht gezielte Anfragen an das Spektrometer zu stellen. Diese werden scheinbar ignoriert denn ich bekomme keine Antwort.

Das Protokoll sieht so aus: DLE STX seq node lsb msb data DLE ETX
DLE STX…0x10,0x02 Startsequenz
seq…zb 0x00 Anfragenummer
node…0x00 Datenrichtung Empfänger oder Senden
lsb…Last significant Bit der Länge des Datenstroms
msb…most significant Bit der Länge des Datenstroms
data…Datenbits zb 0x06 für getDeviceConfiguration
DLE ETX…0x10,0x03 Schlusssequenz

Um also von dem Gerät die DeviceConfiguration zu bekommen muss ich “0x10,0x02,0x00,0x00,0x01,0x00,0x06,0x10,0x03” rausschicken.
Daher:

byte[] sendBuffer1 = {0x10,0x02,0x00,0x00,0x01,0x00,0x06,0x10,0x03};   
outputStream.write(sendBuffer1);

Leider bekomme ich dann aber keine Anwort vom Gerät.

Hoffe Ihr könnt mit diesen Informationen was anfangen, ansonsten bitte einfach fragen. Freu mich auf eure Antworten - danke schon jetzt!

martin

probier mal das du flush vom Stream aufrufst

hmm,

das musst du mir bitte erklären.

Weiß leider nicht was ein Flush ist. rot

outputstream.flush() :wink:

Kann es vllt sein, dass die Angabe des lsb und des msb falsch sind? Wenn man 0x06 als Code hinüberträgt, ist das ja binär

00000110

Jetzt ist mir nicht klar, wie man auf ein lsb von 0x01 und msb von 0x00 kommt.

Hallo,

LSB … last significant byte of lenght of data field in bytes
MSB…most

gibt also die Anzahl der Feldelemente an, die für Data reserviert werden sollen.

Ach ja und noch eine Frage:

First Byte | Second Byte

DLE (0x10) | STX (0x02) -> Start of message
DLE (0x10) | ETX (0x03) -> Ende of message
DLE (0x10) | DLE (0x10) -> Data byte 0x10

Zur Übertragung des Wertes 0x10, muss ich also 0x10 0x10 schicken. Im Datenblatt heißt es dazu:

The DLE DLE sequenz is used to prevent possible DLE bytes in the transmitted binary stream from beeing recongnised as the start of a control sequenz. The sender replaces any DLE bytes **in the data** by two DLE bytes. The datalink of the receiver will convert a DLE DLE sequenz to one DLE byte.

Meine Frage:
(?) Gilt diese Abmachung jetzt nur für den “Datenteil” des Streams, oder für den gesammten. Soll heißen: muss ich auch ein 0x10 im LSB durch ein 0x10 0x10 ersetzen?

(?) Wenn ich jetzt eine Messung starten will muss ich neben meiner Command_ID (in diesem Fall 0x03) auch einen Parameter mitschicken. Dieser lautet nr_aver und ist ein unsigned short (von 0x01 bis 0x7FFF) und bräuchte damit 2 Feldelemente.
Annahme für nr_aver = 10000 dez = 0010 0111 0001 0000 binär = 0x2710 hex
Bei der Aufteilung auf die zwei Feldelemente bin ich mir nicht sicher ob ich das
so:
0010 0111 und 0001 0000 (mitte geteilt)
…entspricht 0x27 und 0x17
oder so:
0010 0111 und 0011 0111 (Hi und LowRegister, ähnlich wie bei TimerPreload: gnazzahlige Division durch 255 = MSB, 10000-MSB*255 = LSB)
…entspricht 0x27 und 0x37

So also hätten wir als Command_ID 0x03 und als Parameter (geraten) 0x27 und 0x37.
Damit beträgt die Länge meiner Daten 3 Felder => LSB = 3, MSB = 0

mein outputStream setzt sich also aus folgenden Werten zusammen:
DLE STX…0x10,0x02
seq…0x01
node…0x00
lsb…0x03
msb…0x00
command ID…0x03
parameter…0x27 und 0x37
DLE ETX…0x10,0x03

  //                   DLE, STX, SEQ,NODE, LSB, MSB,DATA,PAR1,PAR2, DLE, ETX```
(?) Wenn jetzt angenommen einer meiner Paramter 0x10 wäre, würde ich ihn einfach ein zweites mal angeben und mein LSB um eins erhöhen??

(?) Was ist wenn mein Paramter keine unsigned short sondern ein unsigned char[64] ist und ich durch die Doppelangabe den Bereich von [64] überschreite?

gut, ich glaube ich habe genug geschrieben ;)
bitte um eure Hilfe

[QUOTE=eisenhauer]Ach ja und noch eine Frage:

First Byte | Second Byte

DLE (0x10) | STX (0x02) -> Start of message
DLE (0x10) | ETX (0x03) -> Ende of message
DLE (0x10) | DLE (0x10) -> Data byte 0x10

Zur Übertragung des Wertes 0x10, muss ich also 0x10 0x10 schicken. Im Datenblatt heißt es dazu:

The DLE DLE sequenz is used to prevent possible DLE bytes in the transmitted binary stream from beeing recongnised as the start of a control sequenz. The sender replaces any DLE bytes **in the data** by two DLE bytes. The datalink of the receiver will convert a DLE DLE sequenz to one DLE byte.

Meine Frage:
(?) Gilt diese Abmachung jetzt nur für den “Datenteil” des Streams, oder für den gesammten. Soll heißen: muss ich auch ein 0x10 im LSB durch ein 0x10 0x10 ersetzen?
[/QUOTE]

Nur für den Datenteil, schätze mal das ist sowas wie Bit-Stuffing bei HDLC.

[QUOTE=eisenhauer;9283]
(?) Wenn ich jetzt eine Messung starten will muss ich neben meiner Command_ID (in diesem Fall 0x03) auch einen Parameter mitschicken. Dieser lautet nr_aver und ist ein unsigned short (von 0x01 bis 0x7FFF) und bräuchte damit 2 Feldelemente.
Annahme für nr_aver = 10000 dez = 0010 0111 0001 0000 binär = 0x2710 hex
Bei der Aufteilung auf die zwei Feldelemente bin ich mir nicht sicher ob ich das
so:
0010 0111 und 0001 0000 (mitte geteilt)
…entspricht 0x27 und 0x17
oder so:
0010 0111 und 0011 0111 (Hi und LowRegister, ähnlich wie bei TimerPreload: gnazzahlige Division durch 255 = MSB, 10000-MSB*255 = LSB)
…entspricht 0x27 und 0x37

So also hätten wir als Command_ID 0x03 und als Parameter (geraten) 0x27 und 0x37.
Damit beträgt die Länge meiner Daten 3 Felder => LSB = 3, MSB = 0

mein outputStream setzt sich also aus folgenden Werten zusammen:
DLE STX…0x10,0x02
seq…0x01
node…0x00
lsb…0x03
msb…0x00
command ID…0x03
parameter…0x27 und 0x37
DLE ETX…0x10,0x03

  //                   DLE, STX, SEQ,NODE, LSB, MSB,DATA,PAR1,PAR2, DLE, ETX```
(?) Wenn jetzt angenommen einer meiner Paramter 0x10 wäre, würde ich ihn einfach ein zweites mal angeben und mein LSB um eins erhöhen??

(?) Was ist wenn mein Paramter keine unsigned short sondern ein unsigned char[64] ist und ich durch die Doppelangabe den Bereich von [64] überschreite?

gut, ich glaube ich habe genug geschrieben ;)
bitte um eure Hilfe[/QUOTE]

Du kennst dich da schonmal auf jeden Fall besser aus als ich, von dem zweiten Verfahren (0x27 und  0x37) hab ich nämlich noch nichts gehört, eigentlich müsste so etwas dann aber im Protokoll spezifiziert sein, ansonsten würde ich vom ersten Fall ausgehen. Notfalls testen...

hallo

hab mich da vertan, die beiden Varianten sind eig die gleichen:

10000 dez = 10011100010000 binär = 0x2710 hex

eins:
0010 0111 und 0001 0000 (mitte geteilt)
…entspricht 0x27h und 0x10h

zwei:
10000/255 = 39 dez = 0x27h
10000 - 256*39 = 16 dez = 0x10h

tschuldigung für den Fehler ::crazy

So aber noch was, vl hab ich diesmal Glück:

Möchte Versuchen aus 4 byte Feldern ein float machen, hab natürlich zuerst gegoogelt und aus den gefundenen Informationen folgende Testclasse erstellt:

byte[] bytes = { (byte)182, (byte)243, (byte)157,(byte)63 }; // Wert: 1.234
ByteBuffer bbuffer = ByteBuffer.wrap(bytes);
FloatBuffer floBuffer = bbuffer.asFloatBuffer();
System.out.println("Floatversuch: "+floBuffer.get());

Leider kommt jetzt aber nicht 1.234 raus sondern

Floatversuch: -7.26027E-6

Weiß jemand woran das liegen könnte?