Portál AbcLinuxu, 27. října 2025 08:54
Řešení dotazu:
cat. Problém je v tom, že to, čo je k tomu portu pripojené, musí nejak dať najavo, že "teraz!". A podľa toho, čo som za poslednú minútu našiel na googli/wiki, tak sa to urobí tak, že to pripojené zariadenie musí zacvičiť s napätím na pine #1 (strobe). A možno to ešte treba potvrdiť nastavením stavu na pine #10 (acknowledge).
Pri opačnom smere stačilo urobiť cat - > /dev/lp0 a z tlačiarne už liezol papier
Tipujem, že čítanie v princípe znamená otvoriť /dev/lp0 na čítanie a čítať.
Tipuješ špatně. Znamená to:
# nastavit v BIOSu port do "hloupého" režimu
# a pak
## napsat program přistupující na fyzické io adresy printerportu a správně obsluhující handshake převodníku a ten spouštět pod rootem,
## nebo napsat driver do kernelu který udělá /dev/něco co bude správně obsluhovat handshake převodníku a pak můžeš použít ten cat /dev/něco
Ale když ty programovat neumíš .... 
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>
#define portC 0x37a
int main()
{
if (ioperm(portC, 1, 1))
fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
outb(0, portC);
int dataC = inb(portC);
printf("%i\n", ((256*(dataC-192))));
return(dataC);
}
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>
#define portD 0x37c
#define portC 0x37a
int main()
{
if (ioperm(portD, 1, 1))
fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
outb(0, portD);
outb(0, portC);
int dataD = inb(portD);
int dataC = inb(portC);
printf("%i\n", ((dataD+256*(dataC-192))));
return(dataC);
return(dataD);
}
returny by neměly fungovat.
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>
#define portD 0x37c
#define portC 0x37a
int main()
{
if (ioperm(portC, 1, 1)) fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
if (ioperm(portD, 1, 1)) fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
outb(0, portD);
outb(0, portC);
int dataD = inb(portD);
int dataC = inb(portC);
printf("%i\n", (dataD+256*(dataC-192)));
}
Pozor, LPT port ve standardním režimu (aka "SPP") teoreticky není obousměrný. Některý LPT hardware se dá znásilnit, protože budiče nejsou příliš silné, a čtení dotyčného registru skutečně čte stav vnějších pinů... Pokud ale dokážete LPT přepnout do režimu EPP (nebo snad i ECP), tak je to jiná - při čtení by měl být výstupní budič ve třetím stavu (vysoká impedance). Pokud se nepletu, příslušnou konfiguraci bych očekával v "out of band" registrech SuperIO švába, kterým je LPT port v moderním železe implementován - a na tyto registry je v lepším případě navázáno menu v BIOS SETUPu, kde lze režim portu zvolit. Pokud zjistíte typ SuperIO švába (je-li přítomen), asi bych dokázal dohledat víc.
ppdev (modprobe ppdev), příklad kódu je tady (kapitola User-Mode Access):
https://www.htlinux.com/parallel_port_control_in_linux/
Na to pak stačí, abyste měl oprávnění k příslušnému souboru v /dev/ - u mě stačilo přidat si uživatele, pod kterým pracuju, do skupiny lp: gpasswd -a uzivatel lp
(Na hračky typu Arduino se vykašlete.)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.