serielle Schnittstelle in Tastaturpuffer umleiten
-
Hallo Leute,
ich suche gerade nach einem Weg die Daten der seriellen Schnittstelle direkt in den Tastaturpuffer umzuleiten.
Das Problem ist folgendes:
Die Daten eines stationären Barcodescanners sollen in ein bereits fertiges Programm gebracht werden. Ich kann also keine Änderungen im Programm vornehmen so von wegen Überwachung der Schnittstelle. Die Daten einfach nur zur Anzeige bringen ist kein großes Problem:
> cat /dev/ttyS0
und schon sehe ich die Daten in einer Konsole. Wie bekomme ich sie aber in ein anderes Programm?Hat jemand Vorschläge?
-
Einfach eine pipe benutzen, wie sonst auch...
> cat /dev/ttyS0 | prog
Ansonsten schau mal in die FAQ. Da steht ein netter Artikel über serielle Schnitstellen.
-
Bis zur pipe war ich auch schon, funktioniert aber leider nicht immer.
VI zum Beispiel nimmt die Daten an, Kate allerdings nicht.
Das liegt wohl an QT wie ich das überblicke. Habe mir ein gaaaanz einfaches Testprogramm in QT geschrieben (Textedit, sonst nix) und da tut sich nichts. Leider ist die Anwendung wo die Daten rein sollen auch in QT geschrieben.Trotzdem danke für die Antwort.
-
Pipes funktionieren natürlich nur, wenn das Programm auch von der Standard Eingabe liest und diese verarbeitet. Ein GUI-Programm macht das ja in der Regel nicht!
-
Und somit wären wir dann beim X-Server angekommen.
Ich glaube fast ich sollte einfach einen Tastatureinschleifer anschaffen.
-
gelini schrieb:
Und somit wären wir dann beim X-Server angekommen.
Ich glaube fast ich sollte einfach einen Tastatureinschleifer anschaffen.
Der Xorg kommt doch, soweit ich weis, auch mit mehreren Input-Devices zurecht. Vielleicht kannst du deinen X11-Server so konfigurieren, dass er auch noch von der seriellen schnittstelle liest.
-
ProgChild schrieb:
gelini schrieb:
...
Der Xorg kommt doch, soweit ich weis, auch mit mehreren Input-Devices zurecht. Vielleicht kannst du deinen X11-Server so konfigurieren, dass er auch noch von der seriellen schnittstelle liest.
Im Prinzip stimmt das wohl, der X-Server unterstützt mehrere Input-Devices parallel. So zum Beispiel ein Touchpad, ne Maus, eine Tastatur usw. Allerdings muss in der config jeweils der richtige Treiber mit eingetragen werden. Da ich noch keinen Treiber für Barcodescanner oder auch andere serielle Geräte finden konnte habe ich jetzt vor mir einen eigenen zu schreiben. Dazu fehlen mir eber leider die grundlegenden Information. Wie muss ein Input-Device-Treiber für xf86 aussehen, worauf sollte man aufbauen, ...?
Ich bin für ALLE Inforamtionen in dieser Richtung dankbar.
-
gelini schrieb:
Ich bin für ALLE Inforamtionen in dieser Richtung dankbar.
naja, vielleicht koennte das helfen
barcode abfragen und via
http://www.xfree86.org/4.4.0/XSendEvent.3.html
an das progam schickenbesser waers allerdings das program zu aendern, weil alle loesungen sosnt kruecken sind
-
Na das klingt doch schon mal nicht schlecht.
Habe mir eben aus dem Netz ein kleines Programm gesucht, dass ihm übergebene Argumente als Tastatureingabe an ein spezielles Window weitergeben soll.
#include <stdio.h> #include <stdlib.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <string.h> int main (int argc, char *argv[]) { Display *dpy; Window window; char *s; int i; if (argc<3) { printf("usage: ./sendkey windowid key1 key2 key3 etc.\n\n"); return(1); } if ((dpy=XOpenDisplay(NULL))==NULL) { fprintf(stderr, "error: cannot open display\n\n"); return(1); } window=(Window)strtol(argv[1], &s, 0); if (*s) { fprintf(stderr, "error: bad windowID\n\n", s); XCloseDisplay(dpy); return(1); } for (i=2; i<argc; ++i) { XEvent ev; KeySym key; ev.xkey.type=KeyPress; ev.xkey.window=window; ev.xkey.root=ev.xkey.subwindow=None; ev.xkey.time=0; ev.xkey.x=ev.xkey.y=ev.xkey.x_root=ev.xkey.y_root= 0; ev.xkey.state=0; key=XStringToKeysym(argv[i]); ev.xkey.keycode=XKeysymToKeycode(dpy, key); ev.xkey.same_screen=True; XSendEvent(dpy, window, True, KeyPressMask, &ev); ev.type=KeyRelease; XSendEvent(dpy, window, True, KeyReleaseMask, &ev); } XCloseDisplay(dpy); return(0); }
Nun bekomme ich aber beim make die Meldung:
... undefined reference to 'XOpenDisplay'
usw.Mir ist schon klar, dass der Linker da den Pfad nicht findet, also: Pfad setzen.
Einlocate Xlib.h
bringt mir den Pfad:
/usr/X11/include/X11/Xlib.hStarte ich jetzt den Linker mit -l/usr/X11/include/ so meldet er mir:
...: cannot find /usr/X11/include/Tja, jetzt bin ich verwirrt. Schließlich weiß ich ja, dass das Verzeichnis existiert.
Irgendwelche Tipps oder Hinweise dazu?
-
edit: bloedsinn, hab den halben inhalt verschlafn
du musst gegen die entsprechenden libs linken
-lX11, include is fuern compiler und das hat ja anscheinend bei dir funktioniert
-
Alles klar, so langsam steig ich doch wieder durch.
Leider falle ich auch mit -lX11 auf die Nase.
Hattest wohl Recht mit dem Post von wegen X11-devel.Nun hab ich das Problem, dass ich hier auf nem Linux-Server in ner Firma arbeite, und da mal eben ein paar develop-Pakete nachziehen, nicht so einfach für nen normalen user.
Werde die Geschichte wohl heute Abend erst mal zu Hause testen. Schließlich hab ich da die MACHT.
Auf jeden Fall schon mal Danke bis hier hin.
-
Problem gelöst.
So, hatte mittlerweile Zeit die ganze Sache mal anständig auszuprobieren. Funktioniert ganz gut bis jetzt.
Hier noch mal kurz der Ablauf (falls jemand was ähnliches machen will)
1. serielle Schnittstelle überwachen
2. wenn Daten anstehen, diese Lesen
3. XOpenDisplay(...)
4. mit XGetInputFocus(...) das Fenster im Vordergrund ermitteln
5. Daten der Schnittstelle aufbereiten und mit XSendEvent(...) an die Applikation leiten
6. XCloseDisplay(...)Wichtig dabei:
Das Paket xorg-dev (so heißt es unter Kubuntu) muss installiert sein.
Dem Linker das Flag -lX11 mitgeben.