Newsgroup: it.comp.lang.c
Titolo: Scrivere sulla porta parallela. (scrivere e leggere dalla seriale)

 Buongiorno a tutti,
 uso il compilarote della Borland C++ sotto Windows 98 e ho trovato nell'
Help il seguente esempio:
#include <conio.h>
#include <stdio.h>
int main(void)
{
   int port = 0;
   int value = 'C';
   outport(port, value);
   printf("Value %d sent to port number %d\n", value, port);
   return 0;
}
che dovrebbe scrivere un valore sulla porta parallela e invece mi da errore.
Perche'?
Ho provato anche altri comandi tipo: outp, outportb ma di da sempre l'errore
di undefined function.
Grazie dell' aiuto.
Nikolaj
P.S. Se qualcuno sa  i comandi per leggere e scrivere attraverso le porte
parallele/seriali sotto Win 98 e Linux Red Hat 8.0 mi farrebbe un
grandissimo favore!

    outport(port, value);
La outport, se non ricordo male, e' semplicemente una macro che usa
l'istruzione "OUT" in Assembly 80x86, facendo qualcosa tipo:
  MOV DX, port
  MOV AL, value
  OUT DX,AL
Nell'esempio che tu hai riportato, il valore di "port" e' zero, e
questo e' sicuramente un problema, dato che la prima porta parallela
di default dovrebbe essere (..ebbene si', son tanti anni che non
programmo in dos cosi' a basso livello ;) intorno a 0x378.
Una miglior soluzione per trovare l'indirizzo della prima porta
parallela e' leggere il contenuto della locazione 0x408 (vado a
memoria di nuovo ;) con qualcosa tipo:
port = *((unsigned int far *) 0x408);
Ovviamente il tutto funziona "solo" sotto Dos e/o win3.1/95/98 come
applicativo 16bit, dato che a 32bit quelle locazioni non sono
accessibili direttamente.
Suppongo pero' che se usi Google puoi trovare pacchi di indirizzi con
roba utile.
Ad esempio:
http://www.fmrib.ox.ac.uk/tdg/devices/index.shtml?pport
... con anche qualche circuitino da auto-costruirsi...
Buona fortuna!
ZioBit

fai una ricerca con oggetto "seriale"
su it.comp.lang.c
it.comp.os.linux.development
negli ultimi 40 giorni, ne abbiamo parlato.


Questo funziona su Linux (ho usato mandrake 8.0 ma dovrebbe andare bene con
tutti)
#include <unistd.h> /* for libc5 */
#include <sys/io.h> /* for glibc */
#include <asm/io.h>
#define BASEPORT 0x378 // lp1
	char byte = 0;
	//Access to the port
	if(ioperm(BASEPORT, 3 ,1))
	{ return -1;}
 
        byte = 0xFF //o quello che ti pare
	//write the data out
	outb(byte,BASEPORT);
	//read the status
	inb(BASEPORT+1);
	//free the port
	if(ioperm(BASEPORT, 3 ,0))
	{ return -1;}
A me funziona bene (accendo e spengo dei led)
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 Ciao
 Ho provato a compilare questo programmino sul mio PC Red Hat e mi da un
sacco di errori.
 Mi da' i seguenti errori:
 /usr/include/asm/io.h: redefinition of 'inb'
 /usr/include/asm/io.h: 'inb' previously defined here
   ecc., ecc.
Dove sbglio?
(scusa la mia ignoranza)
Niko.


 Ho provato anche con l'ndirizzo 0x378 e mi da l'errore di segmentation
fault
 Lavoro sotto Linux Red Hat e ho un Pentium III penso 32 bit.
faccio
#define address 0x378
outb(0,address)
la compilazione e' ok, il run no.
(scusa la mia ignoranza e grazie dell'aiuto)
Nikolaj

 Ciao
Se sei il Gerardo che mi ha scritto in privato, ti sei dimenticato di dire
che tu disabiliti TUTTI i controlli del compilatore.
Come ho gia' avuto modo di scriverti non credo che questa (pur funzionando
:-) ) sia buona programmazione sotto sistemi tipo Linux o Win NT/2000/Xp in
quanto accedi a locazioni che non sono di competenza del tuo programma e
quindi in SEGMENTATION FAULT.
Ciao
Giuseppe