[prog-it] Re: porta seriale

  • From: "Seeman79" <Seeman79@xxxxxxxxx>
  • To: <prog-it@xxxxxxxxxxxxx>
  • Date: Tue, 28 May 2002 17:19:00 +0100


From: "valerio" <valerio_ligabue@xxxxxxxxx>
Subject: [prog-it] Re: porta seriale
Date: Tue, 28 May 2002 12:58:13 +0200

| [snip]
| Non e` che qualcuno sa indicarmi dove trovare
| le specifiche
Cosa intendi per specifiche?

| per pilotare le porte seriale e/o parallela in
| C e/o Pascal ?
Per quale sistema operativo?
Cmq ti do una panoramica generale; se ti serve poi
approfondire un qualche aspetto in particolare,
posta la tua richiesta.

* DOS in C:
Sotto DOS puoi usare varie funzioni presenti nella
libreria <dos.h> che ti permettono di leggere/scrivere,
ad esempio, sulle porte seriali.
Come prima cosa devi conoscere gli indirizzi di tali
porte; in genere sono i seguenti:

COM1 0x3F8
COM2 0x2F8
COM3 0x3E8
COM4 0x2E8

Ho detto in genere perche' e' possibile che sul tuo
sistema siano diversi; ci sono molti modi per verificare
questi indirizzi: bios, windows, scriversi una procedura
che lo fa, ecc. ecc.
Le funzioni con cui puoi leggere dalla porta seriale
sono inportb (guardati anche inport) che accetta come
parametro l'indirizzo della porta e restituisce un intero
(il carattere letto), oppure te ne puoi scrivere una con
una paio di righe assembler da inserire in mezzo al tuo
codice C.

Al contrario, le funzioni con cui puoi scrivere sulla porta
seriale sono, con grande sforzo di fantasia, outportb (guardati
anche outport) che accetta come parametri l'indirizzo della
porta e il carattere da scrivere; anche qui, cmq, te ne puoi
scrivere una con una paio di righe assembler da inserire in
mezzo al tuo codice C.

* LINUX in C:
In linux, sotto un certo punto di vista, le cose sono piu'
semplici da gestire; tutti i settaggi che vuoi dare alla
porta durante la tua sessione vengono memorizzati in una
struttura definita in <asm/termbits.h> come segue:

#define NCCS 19
struct termios
   {
     tcflag_t c_iflag;   /* flag modalita' input */   
     tcflag_t c_oflag;   /* flag modalita' output*/
     tcflag_t c_cflag;   /* flag modalita' controllo */
     tcflag_t c_lflag;   /* flag modalita' locale*/
     cc_t c_line;        /* descrittore linea */  
     cc_t c_cc[NCCS];    /* caratteri di controllo */
   };
         
Esistono vari modi per affrontare il problema, a seconda del
tipo di input/output che devi realizzare; che so, canonico o
asincrono o multi sorgenti...
Questi sono argomenti che non si possono liquidare in poche
righe (non sto dicendo che siano cose esageramente complicate),
ma che richiedono il loro tempo di "assimilazione".

Cio' che devi fare, in generale, e' aprire il device in oggetto
con una chiamata "open", una cosa del tipo:

int pippo;

if((pippo = open("/dev/modem", O_RDWR | O_NOCTTY )) < 0)
   {
     perror("/dev/modem");
     exit(-1);
   }
         
Una volta fatto cio' devi "descrivere" il tipo di dialogo
che intendi intraprendere con la relativa porta, settando
una struttura di tipo:

struct termios pluto;

agendo sui flags che ti elencavo prima (io ti consiglio di
salvare i vecchi parametri prima di flusharli, in modo da
ripristinarli al termine della tua sessione).

Fatto cio' le operazioni di lettura e scrittura sulla porta
le esegui con delle normali chiamate alle funzioni read &&
write:

int paperino;
char topolino[MAX];

read(pippo, &paperino, 1);
write(pippo, topolino, strlen(topolino));

Non c'e' altro da aggiungere se non che devi prima guardarti
la gestione ed il dialogo "a basso livello" (neanche tanto)
dell'hardware in linux.

* PASCAL
Le poche volte che ne ho avuto bisogno, ho sempre inserito
codice assembler all'interno dei miei programmi; non saprei
dirti che esistono procedure e/o funzioni gia' "confezionate".

Alla prossima.
Ciao.


-- 
Se si ritrova un oggetto smarrito, sparira' qualcos'altro.




Other related posts: