Stream auf nicht druckbare Zeichen filtern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
atomical
Beiträge: 118
Registriert: 13.04.2005 22:48:41
Wohnort: Wilsdruff

Stream auf nicht druckbare Zeichen filtern

Beitrag von atomical » 06.12.2005 00:09:15

Hallo!

Ich habe folgendes Problem:

Ein per RS232 angeschlossener Thermodrucker soll durch einen Nadeldrucker (Protokolldrucker) abgelöst werden. Die verschiedenen (unwichtigen) Formatierungsfunktionen des Thermodruckers werden durch diverse Steuerzeichen bzw. Zeichen jenseits des ASCII-Standards (Codetabelle unbekannt) ausgegeben. Direkt durchgereicht druckt der Nadeldrucker wild vorsich hin - allerdings nichts, was man lesen könnte.

Da am Ende sowieso nur der Text wichtig ist, soll jetzt alles andere (Steuerzeichen außer LF und alles jenseits ASCII) auf dem Weg von /dev/ttyS0 nach /dev/lp0 rausgeschmissen werden.

Mein selber gebasteltes Bashscript tut dies mit ordentlich CPU-Last dateiweise Zeile für Zeile ganz gut - das äquivalente Perl-Script kommt mit wesentlich weniger CPU-Zeit aus - allerdings auch nur zeilenweise - und genau da liegt das Problem - ich krieg es nicht hin, zeichenweise von /dev/ttyS0 zu lesen UND Zeiträume, in denen nichts kommt, ohne Probleme abzuwarten.

Konkret würde mich interessieren, ob und (wenn ja) wie ich mit Bash und/oder Perl zuverlässig ständig auf Zeichen aus der seriellen Schnittstelle warten und diese entsprechend in "Echtzeit" weiterverarbeiten kann - getc auf /dev/ttyS0 hab ich probiert - das bricht nach ein paar Sekunden Funkstille von sich aus ab ...

Alternaiv interessiert mich alles, was in die Richtung geht, einen Stream auf nichtdruckbare Zeichen zu filtern ...
mfg, atomical

Benutzeravatar
seep
Beiträge: 544
Registriert: 31.10.2004 14:21:08
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: HSK

Beitrag von seep » 06.12.2005 07:30:48

Normalerweise sollte es ja ein

Code: Alles auswählen

sed s/foo/bar/g < /dev/ttyS0 > /dev/lp0
tun. Vielleicht magst Du uns Dein Bash- und Perl-Script mal zeigen um zu schauen, was man da verbessern kann.

Benutzeravatar
atomical
Beiträge: 118
Registriert: 13.04.2005 22:48:41
Wohnort: Wilsdruff

Beitrag von atomical » 06.12.2005 21:46:21

Soweit so gut - ein

Code: Alles auswählen

cat /dev/ttyS0 | tr -dc "\012 -~"
schreibt mir die gefilterten Daten in die aktuelle Konsole ...

Code: Alles auswählen

cat /dev/ttyS0 | tr -dc "\012 -~" > /dev/lp0
oder auch

Code: Alles auswählen

cat /dev/ttyS0 | tr -dc "\012 -~" > test.txt
wartet immer volle 4096 Byte ab und schreibt dann in die jeweilige Datei - sprich er würde nur alle 4kB drucken ...

:?:

Hat jemand noch eine Idee?
mfg, atomical

Antworten