Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.09.2007, 11:35
Worldcraft Loser



Hallo zusammen,

ich habe einen Kartenleser welcher per serieller Schnittstelle angesprochen wird.
Die Kommunikation über die Schnittstelle mit meinem Javaprogramm funktioniert mit
anderen Geräten ohne Probleme,aber der Leser hat ein eigenes Protokoll, deswegen
vermute ich den Fehler dort.

Das Protokoll besitzt folgenden Aufbau:
1. Byte: SOH Protokolltyp & Startzeichen
2. Byte: ADR Busadresse
3. Byte: CMD Kommando
4. Byte: AZA Datenanzahl
5. Byte: Daten oder Parameter
n. Byte: BCC Prüfsumme

Als Beispiel Kommando benutze ich im folgenden das Statusauslesen.
Laut Handbuch wird dies so realisiert:
HexCode|
02 | SOH | Satzstartzeichen
xx | ADR | Moduladresse (01..10H) // In meinem Fall 01, da kein bus vorhanden also das erste Gerät
41 | CMD | Lese Status INTERN
00 | AZA | Datenanzahl = 0
cc | BCC | Prüfsumme

Der CRC wird als ein 8-bit BCC (byteweises XOR auf die Daten) erzeugt.

So.. das war die Theorie.. ;)
Die Anforderungen habe ich nun wie folgt umgesetzt:

Quellcode:byte[] b = new byte[] { 0x02, 0x01, 0x2A, 0x00 }; // Einzelnen Bytes festlegen

int pruefsumme = 0;
        
for (int i = 0; i < b.length; i++) {
pruefsumme = pruefsumme ^ b[i]; // XOR'n
}
Und wird mit folgendem Code gesendet:
Quellcode:serialPort.getOutputStream().write(b);
serialPort.getOutputStream().write((byte)pruefsumme).getBytes();
Versuche mit .flush(), "\r\n" usw. brachten auch keinen Unterschied.

Das Problem ist, das ich keine Antwort kriege, laut Hersteller wird allerdings auch kein Fehlercode/Fehlermeldung zurückgegeben.

Ich hoffe das reicht an angaben, sonst einfach nachfragen :)

Vielen Dank

mfg

Christian

--

(\_/)
(O.o)
(> < ) This is Bunny. Copy Bunny into your signature to help him on his way to world domination!

zum Seitenanfang zum Seitenende Profil || Suche
001
27.09.2007, 14:46
LeJean



hast du mal versucht nur ein byte (startzeichen) auf den Stream zu schreiben, notfalls zu flushen (obwohls ja kein buffered Stream is) und dann mal vom InputStream zu lesen? Nur gucken ob nich ggf doch was zurückkommt, was auch immer..

--

zum Seitenanfang zum Seitenende Profil || Suche
002
27.09.2007, 20:31
oxff



Wieso write(..).getBytes()?

--

mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik

zum Seitenanfang zum Seitenende Profil || Suche
003
27.09.2007, 23:32
Kriz



Klammerfehler. Sollte wohl Quellcode:serialPort.getOutputStream().write(((byte)pruefsumme).getBytes()); heißen.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
004
28.09.2007, 08:10
Worldcraft Loser



Zitat:
LeJean postete
hast du mal versucht nur ein byte (startzeichen) auf den Stream zu schreiben, notfalls zu flushen (obwohls ja kein buffered Stream is) und dann mal vom InputStream zu lesen? Nur gucken ob nich ggf doch was zurückkommt, was auch immer..
Da reagiert der Leser auch nicht drauf :\

Und wegen dem .getBytes(), das kam durchs herumexperimentieren, kann aber einfach weggelassen werden.

--

(\_/)
(O.o)
(> < ) This is Bunny. Copy Bunny into your signature to help him on his way to world domination!

zum Seitenanfang zum Seitenende Profil || Suche
005
28.09.2007, 11:32
LeJean



Mmh.. hast das mal so probiert wie Kriz geschrieben hat? Also den eventuellen Klammerfehler ausgebessert?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
28.09.2007, 12:44
Worldcraft Loser



Ja... aber hat auch nichts gebracht. :\

Aber mein Chef hat nun andere Leser bestellt, welche kein Protokoll haben :)

Danke aber trotzdem für die Hilfe!

--

(\_/)
(O.o)
(> < ) This is Bunny. Copy Bunny into your signature to help him on his way to world domination!

zum Seitenanfang zum Seitenende Profil || Suche
007
30.09.2007, 23:43
default



Quellcode:byte[] b ...;
int pruefsumme = 0;
pruefsumme = pruefsumme ^ b[i]; // XOR'n
serialPort.getOutputStream().write((byte)pruefsumme).getBytes();
was sprach nochmal dagegen für prüfsumme direkt "byte" als datentyp zu nehmen?

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche