Portál AbcLinuxu, 5. května 2025 09:19

Dotaz: Jak číst paralelní port?

14.10.2020 10:14 U!U!U!
Jak číst paralelní port?
Přečteno: 933×
Odpovědět | Admin
Mám starší A/D převodník z NDR C571C (AD571) a napadlo mě připojit ho k nevyužívanému paralelnímu portu a měřit s ním. Jenže z /dev/lp0 přímo číst nejde, v repozitáři nevidím nic, co by umělo s paralelním portem pracovat a v céčku ošklivě plavu. Ještě je tady jeden problém - převodník má 10 bitů na výstupu, paralelní port má sice 8 bitů, ale určitě by šlo použít i třeba /Strobe a /LineFeed. Mé někdo nápad, co s tím? Chci z toho příkazem jednorázově dostat hodnotu, je mi jedno, jestli desítkovou (0-1023), nebo šestnáctkovou. Díky.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.10.2020 10:42 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebylo by jednodušší vzít arduino s USB převodníkem za 35Kč, nahrát na něj firmatu přímo z Arduino IDE a číst interní 10bitový AD převodník např. z pythonu metodou analog_read?
14.10.2020 10:55 U!U!U!
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
To bohužel nebylo, Arduino mne vůbec nic neříká a neláká mne. Přece jen jsem ze stavebnic vyrostl. A chci nějak využít LPT. Jen mě mrzí, že na hrátky se starými porty nejsou v repu žádné nástroje.
14.10.2020 11:14 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Firmware pro arduino (firmata) je hotový, jen se triviálně přes USB nahraje, ani není potřeba nic stahovat kromě Arduino IDE. Výsledkem je destička s USB konektorem, která umí spoustu HW rozhraní a ovládá se jednoduchými příkazy z PC. Knihovny pro firmatu jsou k dispozici pro většinu jazyků. Z mého pohledu je to menší "stavebnice" než holý čip, který má víc bitů než paralelní port.

Ale držím palce. Když jsem si hrál s logickým analyzátorem přes paralelní port, musel jsem na ovládání paralelního portu také přes Cčko (používal jsem myslím nějak ohackovaný http://www.computernerdkev.heliohost.org/tfla-16/index.htm, už je to dávno)
14.10.2020 11:17 X
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechces vyuzit pomoci arduino a neprogramujes v C/C++. No tak to na to muzes rovnou zapomenout. Pochybuji, ze existuje kouzelny program co bude komunikovat zrovna s tvym 10-bitovym prevodnikem, ktery k nemu "jen tak" nadratujes.
14.10.2020 12:15 U!U!U!
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Kdysi jsem viděl kratičký kód (v C), tam to bylo pro zápis, používaly se dva porty (0x378 a 0x379), ale nemůžu ho najít. Jistě by šel po úpravě použít i pro čtení. A ještě jednou - chci využít to, co mám, ne to, co mi přijde za 2 měsíce z Číny. A s Arduinem (nebo jinou stavebnicí) se nechci učit, prostě mi je mnohem bližší vzít si hrst odporů, tranzistorů, IO, do ruky pájku s olovnatým cínem, než jen mezi sebou propojovat moduly, abych se ve výsledku kochal nad blikající LEDkou, když se dá blikátko udělat s jedním tranzistorem, jedním R a jedním C za 5 minut.
14.10.2020 14:59 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je mi trocha smutno, že každý navrhuje nejak to obísť cez Arduino či USB.

Tipujem, že čítanie v princípe znamená otvoriť /dev/lp0 na čítanie a čítať. Trebárs aj cez 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 ;-)
15.10.2020 09:24 pet I. | skóre: 13
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
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íš .... :-(

21.10.2020 02:09 U!U!U!
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak to sdělit, abych stavebničáře neurazil? Skoro to mám!
Trochu jsem šprtal a sesmolil jsem následující:
#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);
}

Tady pracuju s portem 0x37a (řídicí; data lze číst na portu 0x37c v režimu EPP) a - nejdřív se vynuluje (řádek 11), pak se přečte, převede na desítkovou soustavu, odečte 192 (horní 4 bity nelze ovládat a nejsou k nim dráty) a, protože to budou horní 4 bity, vynásobí se to 256. Přestože jsou 3 ze 4 vstupů za invertorem, funguje to.

Jenže jsem se pokusil do toho nabastlit i čtení z datového portu, nevím, kde dělám chybu, ale hází mi to SIGSEGV.
#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);
}
21.10.2020 08:08 MM
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
není tam problém, že ioperm máš jen pro portD ale už ne pro portC? Asi to budeš muset udělat postupně s 2ma ifama
21.10.2020 09:13 pet I. | skóre: 13
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Stačí tam dát >> ioperm(portD, 3, 1) <<
21.10.2020 10:44 U!U!U!
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Ne. Prakticky to přestane fungovat od druhého outb.
21.10.2020 09:18 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Ty dva returny by neměly fungovat.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
21.10.2020 11:59 U!U!U!
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle funguje!
#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)));
}
11.11.2020 20:37 frr | skóre: 34
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Mein Kompliment, že se hrdě pouštíte do práce se starobylým LPT portem :-)

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.
[:wq]
3.11.2020 14:49 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Jak číst paralelní port?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Používání inb a outb je čuňárna, ten program musí běžet pod rootem a nikdy jinak. Vhodnější je použít ovladač 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.)
Quando omni flunkus moritati

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.