Forum: PC-Programmierung Befehle via rs232 übertragen


von Volker (data2000)


Lesenswert?

Hallo zusammen,
ich bin neu hier, daher verzeiht bitte wenn ich die Regeln hier noch 
nicht ganz beherrsche.

Ich suche für folgendes Problem eine Lösung:
Ich habe einen RFID Leser, welcher seine Daten via rs232 an einen RPi 
überträgt. Das funktioniert auch wunderbar.

Die Parameter des RFID Lesers können, über eine Windows 
Konfigurationssoftware und USB/RS232 Adapter, geändert werden. Auch das 
funktioniert.

Leider gibt es diese Software nicht für Linux, außerdem möchte ich 
verschiedene Parameter direkt, ohne diese Software, verändern.
Ich denke, dass müsste über entsprechende Befehle an /dev/serial0 (der 
Link zum COM-Port) funktionieren.
Meine Idee war, die Kommunikation der rs232 Schnittstelle am Windows PC 
während der Einstellung eines Parameters über das Windows Programm zu 
protokollieren oder über od unter Linux auszulesen. Da bekomme ich auch 
verschiedenste Werte.

Beispiel:
Ich schalte über das o.g. Programm den Buzzer aus, welcher nach dem 
einlesen einer Karte kurz piept. Unter Linux erhalte ich via od dann 
folgende Ausgabe:

od -x < /dev/ttyS0
0000000 4652 0001 4100 0300 0107 1b00 4652 0001

Ich habe aber keine Ahnung was ich denn nun mit diesen Werten machen 
soll und wie ich die an den Leser übertrage.

Ich habe hier im Forum etwas in der Richtung gelesen, dass man ein 
yxz.bin File an die Schnittstelle senden soll. Nur wie erstelle ich 
dieses bin File?

Es gibt auch ein SDK für Windows (C#) für den Leser, damit kann ich 
persönlich aber nichts anfangen, da ich es nicht verstehe.

Hat jemand von euch eine Idee, wie ich da vorgehen könnte?

Vielen Dank schon einmal.
VG
Volker

von c-hater (Gast)


Lesenswert?

Volker schrieb:

> Es gibt auch ein SDK für Windows (C#) für den Leser, damit kann ich
> persönlich aber nichts anfangen, da ich es nicht verstehe.
>
> Hat jemand von euch eine Idee, wie ich da vorgehen könnte?

Du könntest es mal mit Lernen versuchen. Nach unbestätigten Gerüchten 
soll das manchmal hilfreich sein...

von BlaBla (Gast)


Lesenswert?

c-hater schrieb:
> Du könntest es mal mit Lernen versuchen. Nach unbestätigten Gerüchten
> soll das manchmal hilfreich sein...

Versuch Du es mal mit Höflichkeit.

von Εrnst B. (ernst)


Lesenswert?

BlaBla schrieb:
> Versuch Du es mal mit Höflichkeit.

Beim C-Hater ist das mit dem Lernen scheinbar auch schwierig... ob er 
jemals noch lernt höflich zu sein?

Volker schrieb:
> Es gibt auch ein SDK für Windows (C#) für den Leser, damit kann ich
> persönlich aber nichts anfangen,

Du musst nicht C# vollständig in allen Details verstanden haben, um aus 
dem SDK (so es denn im Source vorliegt), die Stellen rauszusuchen die 
die Kommunikation mit dem Reader vornehmen.

Halte ich für einfacher, als

Volker schrieb:
> Meine Idee war, die Kommunikation der rs232 Schnittstelle am Windows PC
> während der Einstellung eines Parameters über das Windows Programm zu
> protokollieren oder über od unter Linux auszulesen.

Vor allem, wenn die Kommunikation bi-direktional mit mehreren 
Befehl-Antwort-PingPongs läuft

==> Beide Richtungen mitlesen, ein einfacher (5€)-LogicAnalyzer könnte 
das vereinfachen.

Ansonsten: C# Läuft auch unter Linux (Mono), zumindest die 
Nicht-GUI-Sachen recht problemlos. Insofern läuft das SDK evtl. auch auf 
deinem RasPi. Womit wir aber wieder beim Vorschlag vom C#-Hater sind: Du 
wirst dich mit C# auseinandersetzen müssen.

von Zeno (Gast)


Lesenswert?

Mit Deinem Wissen dürfte Dein Vorhaben recht schwierig umzusetzen sein.

Volker schrieb:
> od -x < /dev/ttyS0
> 0000000 4652 0001 4100 0300 0107 1b00 4652 0001
Das was Du hier zeigst ist eine einfache Folge von Bytes, die hier 
übertragen werden. Ich kenne jetzt das Programm od nicht aber die ersten 
7Byte (0000000) sind ein Zähler (hexadezimal) für die Anzahl der 
vorangehenden Nibble. Eine 2. Zeile des Dumps würde daher mit 0000020 
(dezimal=32) beginnen, weil in DEiner Zeile 8 Worte = 16 Byte = 32 
Nibble übertragen wurden. Interessant für den übertragenen Befehl ist 
also alles was nach 0000000 kommt.

Allerdings wird Dich meine Erklärung auch nicht weiter bringen, weil Dir 
das Verständnis bzw. die Grundlagen hierfür fehlen. Deshalb hat der 
c-hater hier recht, wenn er sagt setze Dich auf den Hosenboden und lerne 
die Basics, wie Bit, Nibble, Byte Wort, serielle Kommunikation etc. 
etc.. Es gibt genug Fachbücher als auch Onlinetutorials wo so etwas 
haarklein beschrieben wird, nur Lernen mußt Du selbst tun.

von Zeno (Gast)


Lesenswert?

BlaBla schrieb:
> c-hater schrieb:
>> Du könntest es mal mit Lernen versuchen. Nach unbestätigten Gerüchten
>> soll das manchmal hilfreich sein...
>
> Versuch Du es mal mit Höflichkeit.
Für c-hater ist das doch ausgesprochen höflich und er hat Recht, der TO 
sollte sich auf den Hosenboden setzen und die Basics lernen.
der ist jetzt schon eine Aufforderung zum eigenständigen Lernen zuviel 
verlangt? - ich denke nicht.

von c-hater (Gast)


Lesenswert?

Zeno schrieb:

> der ist jetzt schon eine Aufforderung zum eigenständigen Lernen zuviel
> verlangt?

Das war ja noch nicht mal eine Aufforderung, sondern eindeutig als 
Vorschlag formuliert.

Ich wüßte nicht, wie man das noch höflicher formulieren sollte. Manche 
Spinner sehen halt Unhöflichkeit überall dort, wo ihnen die Sache selber 
schlicht nicht paßt.

von Michael B. (laberkopp)


Lesenswert?

c-hater schrieb:
> Nach unbestätigten Gerüchten soll das manchmal hilfreich sein...

Keine Weihnachtsgeschenke bekommen ?
Kein Wunder, ätzende Hater wie du bekommen auch nix.

Volker schrieb:
> Ich habe aber keine Ahnung was ich denn nun mit diesen Werten machen
> soll

Erst mal keinen 16 bit dump, sondern 8 bit.

Dann die Datei direkt an den RFID Reader senden und gucken, ob auch das 
zum Umstellen des Buzzers führt.

Mit Gluck bekommst du so eine Sammlung von Dateien für alle 
Konfigurationen.

Schwieriger wird es, wenn die Konfiguration Zahlen als Parameter enthält 
und gar noch eine Prüfsumme. Da will man kaum für jeden Zahlenwert eine 
Datei vorhalten, sondern lieber das Konstruktionsprinzip herausfinden.

Noch schwieriger wird es, wenn die Datei nach challenge response 
jedesmal anderen Inhalt hat.

von Zeno (Gast)


Lesenswert?

Michael B. schrieb:
> c-hater schrieb:
>> Nach unbestätigten Gerüchten soll das manchmal hilfreich sein...
>
> Keine Weihnachtsgeschenke bekommen ?
> Kein Wunder, ätzende Hater wie du bekommen auch nix.
Also in diesen Worten von hater sehe ich nun wirklich keine 
Unhöflichkeit. Da warst Du nach meinem Verständnis jetzt unhöflicher.
Aber sei's drum , ist halt Ansichtskarte.

Michael B. schrieb:
> Erst mal keinen 16 bit dump, sondern 8 bit.
Diese Formatierung scheint das Programm aber so vorzugeben. Man kann 
zwar zwischen verschiedenen Ausgabeformaten wählen, aber die sind noch 
unübersichtlicher. Mit der Option "Ausgabe als Text" bekäme man zwar 
eine Ausgabe als 16 Chars, also 16Byte, das dürfte den TO aber auch 
nicht weiter bringen, da ihm schlichtweg die Grundlagen fehlen.

Michael B. schrieb:
> Schwieriger wird es, wenn die Konfiguration Zahlen als Parameter enthält
> und gar noch eine Prüfsumme. Da will man kaum für jeden Zahlenwert eine
> Datei vorhalten, sondern lieber das Konstruktionsprinzip herausfinden.
>
> Noch schwieriger wird es, wenn die Datei nach challenge response
> jedesmal anderen Inhalt hat.
Ja und da sind wir wieder da, was hier schon der Grundtenor war: Der TO 
wird sich auf den Hosenboden setzen müssen und lernen. Die gebratenen 
Tauben die noch dazu von alleine in den Mund fliegen sind leider aus.

von Günter L. (Firma: Privat) (guenter_l)


Angehängte Dateien:

Lesenswert?

von Volker schrieb:
>Ich habe hier im Forum etwas in der Richtung gelesen, dass man ein
>yxz.bin File an die Schnittstelle senden soll. Nur wie erstelle ich
>dieses bin File?

Mit folgender Befehlszeile kannst du Binärdaten in Textform
in eine echte Binärdatei umwandeln.

xxd -r test.bin.txt > test.bin

Und dann prüfen ob es geklappt hat, mit:

xxd -u -g1 test.bin

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Moin, den kleinen LogicAnalyzer(LA) würde auch ich empfehlen. Der macht 
vieles einfacher und man lernt automatisch neues. Toll das der Volker 
das mit dem Linux Sniffer schon hinbekommen hat. Ich würde das 
mitgelesene gesendete erst mal versuchen mit eigener Software zu senden. 
Dann kannst du es manipulieren und sehen was passiert. Dauert halt ein 
bischen und ist frickelig aber geht. Sollte dir aber auch ab einem 
gewissem Punkt Spass machen. Da hilft der LA dabei.

von ... (Gast)


Lesenswert?

Immerhin hat der TO von 100 % schon fast 50 % richtig gemacht.
Was ja fuer einen Anfaenger eine gute Quote ist.

Statt eines od haette sich eben eher ein hd angeboten.
Das ist leider in vielen "Linuxen" nicht dabei.
Aus einem LA-Log muesste man die Werte womoeglich erst abtippen.

Und das wiederum in C zu senden ist auch Anfaengern kein Problem:

printf("%c%c%c%c",0xde,0xad,0xbe,0xef);

Gegebenenfalls muss man aber zwischen Befehlen dem Reader
Zeit geben um das Kommando auch zu verarbeiten.
Das koennen durchaus auch mal mehrere 100 ms sein.
Da kann es dann schon sinnvoll sein, mit einem LA die
Initialisierung mutzuschneiden, und diese Zeiten zu notieren.

von Volker (data2000)


Lesenswert?

Hallo,
vielen Dank für die Tipps. Da habe ich ja einige interessante Ansätze 
und ich hatte schon immer Spaß an Frickeleien ;-)
Der LA ist im Zulauf.

Für die "sozial engagierten Erzieher" hier, ganz kurz zu mir:
Ich bin Dipl. Ing. im Maschinenbau, habe auch nach mehr als 35 
Berufsjahren in 6 Ländern ganz bestimmt kein Problem damit neues zu 
lernen und vermutlich schon mehr vergessen als so mancher je lernen 
wird.
Aber niemand kann je alles Wissen und daher nochmals danke an alle 
sachlichen Hinweisgeber, denen ich nicht zu dumm oder faul erschien.

VG
Volker

von Adam P. (adamap)


Lesenswert?

Volker schrieb:
> Es gibt auch ein SDK für Windows (C#) für den Leser

Hast du uns einen Link zu dem SDK?
Oder genaue Bezeichnung von dem Leser?

von Volker (data2000)


Lesenswert?

Hallo Adam,
das ich ein ACM812A von Goldbridge.
Alles weitere habe ich Dir, aus vertragsrechtlichen Gründen, als PN 
geschickt.
VG
Volker

von ... (Gast)


Lesenswert?

Ein ueberaus nuetzliches Instrument fuer RFID-Installationen
ist auch eine Impedanzmessbruecke. Ohne steht man sonst im Dunklen.
Die sollte bis mindestens 30 MHz funktionieren und das
Stehwellenverhaeltnis bezogen auf 50 Ohm anzeigen koennen.

Die sind nicht gaaanz so billig wie ein China LA.
Ich hatte mir damals den Palstar ZM-30 ausgeguckt
und der tat was er sollte. Ich hatte "gluecklicherweise" gleich
ein paar MMICs ERA-3 besorgt. Die gingen bei dem naemlich
gerne mal kaputt.

von Volker (data2000)


Lesenswert?

Hallo zusammen,
ich habe inzwischen mein Ziel erreicht, wenn auch nicht sauber mittels 
Programmierung aber über den ursprünglichen Ansatz die gesnifften Daten 
zurück zu senden. Ich führe das mal aus, falls mal jemand ein ähnliches 
Problem hat.

Der LA ist toll, brachte mich wenig weiter, da dieser nicht die Werte 
der tatsächlich gesendeten Daten ausgab. Das kann aber auch eine 
Einstellungsthema in der LA Software sein, mit welchem ich mich im 
Nachgang interessehalber beschäftigen werde.

Die Analyse des C# Codes half auch nur bedingt weiter, weil dieser nur 
Werte an Funktionen aus einer eingebundenen C++ DLL weitergibt. Die C++ 
DLL konnte ich nicht weiter analysieren.
In Github fand ich eine ganze Reihe von Projekten welche RFID Reader 
konfigurieren, bis auf eines binden aber alle diese eine DLL mit ein.
Zumindest weiß ich jetzt etwas mehr über C#.

Tatsächlich behalf ich mich dann mit dem Ausspähen der vom 
mitgelieferten Windows Programm gesendeten Codes mittels dem "Advanced 
Serial Port Monitor" von AGG Software, welcher auch über einen Spy Mode 
verfügt und die serielle Schnittstelle nicht blockiert.
Die so ermittelten Hex Werte,
z.B. 52 46 00 00 00 10 00 00 58
kann ich nun unter Linux mit einem einfachen echo an die serielle 
Schnittstelle senden
echo -e "\x52\x46\x00\x00\x00\x10\x00\x00\x58" > /dev/serial0
.

Theoretisch ergibt das nun, wie auch hier von euch beschrieben, eine 
Liste von Hex-Befehlszeilen. Die Hexwerte bauen aber nummerisch auf 
einander auf, so dass ich recht schnell in der Lage war, den 
entsprechenden Funktionswert und das Byte in der Befehlsfolge 
festzulegen.
Die gesendeten Werte fand ich hingegen im SDK (in Software wie auch in 
der Dokumentation) so nicht wieder, was aber eine andere Geschichte ist.

Mein Problem ist jedenfalls gelöst.

Vielen Dank an alle, die mir hier mit konstruktiven Vorschlägen geholfen 
haben.
VG
Volker

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Sowohl die Salea Soft als auch Open Source Pulseview unterstützen 
div.Protokolle.
Finde heraus welches bei dir verwendet wird. Dann bekommst Du, falls von 
der LA Soft unterstützt, Klartext Info angezeigt. Probiere es aus, lohnt 
sich.

von Test123 (Gast)


Lesenswert?

1.) Mit Wireshark + Rs232Converter die  Kommunikation sniffen und die 
Datei.txt speichern

2.) .bin (auf Windows Konfiguratiostool.exe) ist das 
Konfigurationswerkzeug-Programm (was du programmieren musst) die dann 
auf dein RPi (unter Linux) laufen muss.

Welche Programmiersprache verwendest du?

Kommunikationsprotokoll :(

von Purzel H. (hacky)


Lesenswert?

Das Wichtigste ist das Kommunikationsprotokol. Wenn das nicht bekannt 
ist, kommt eine unvorhersehbare Komponente rein. zB wenn man nicht 
einfach aufgezeichnete Muster wiederholen kann.
Einen unbekannten CRC/Checksumme kann man zB aufzeichenen indem man alle 
Moeglichkeiten durchprobiert. ein 16 bit CRC/Checksumme hat nur 65536 
Moeglichkeiten, die kann man durchprobieren, bis eine Antwort kommt. 
Dumm waere wenn dadurch tatsaechlich eine aktion ausgeloest wuerde.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.