Newsgroup: it.comp.programmare
Titolo: un aiuto su inport/outport

Sto cercando di capire come funzionano queste due funzioni del linguaggio C,
per poter scrivere un programmino di comunicazione tra due computer su porta
seriale.
Soprattutto non riesco a capire come mai non il compilatore, ma il linker mi
dà sempre errore per il seguente codice.
Per chi mi fà la cortesia di rispondermi sappia che lavoro sotto dos e non
sotto linux.
Grazie, Pallade.
---------------------------------------------------------------------------------------
#include <dos.h>
#include <stdio.h>
#include <conio.h>
void outportb(int portid, unsigned char value);
unsigned char inportb(int portid);
unsigned int Port;
void inizializza(){ //fa scegliere la porta seriale da utilizzare
clrscr();
printf("Immetti la porta seriale da usare \n");
printf("[1] COM1 [2] COM2");
scanf("%d",&Port);
if (Port == 1)
 Port=0x03f8;
else
 Port=0x02f8;
printf("\n");
}
void Ricevi()
{
unsigned char dato;
dato=inportb(Port);
putch(dato);
if (dato == 0x0d)
    putch(0x0a); //gestione del comando a capo
}
unsigned char Trasmetti()
{
unsigned char dato;
dato=getch();
if (dato == '\x1b') //termina il programma con ESCAPE
  return(1);
while(!(inportb(Port))); //aspetta la linea libera
outportb(Port,(unsigned char)dato); //trasmette il dato
}
main()
{
unsigned char stato, flag=0;
while(!flag){
      stato=inportb(Port);
      if((stato & 0x1e) != 0){ //errore di ricezione
          printf("errore Porta=%d\n", stato);
          flag=1;}
      else if ((stato & 0x01) != 0) //ho ricevuto un dato corretto
               Ricevi();
      else if (kbhit()) //voglio trasmettere un carattere
            flag=Trasmetti(); }
}
--------------------------------
Inviato via 
http://usenet.libero.it

pallade ha scritto:

Ad una prima occhiata è probabile che il problema dipenda dalla dichiarazione "unsigned
char inportb(int portid);", dovresti provare a vedere se tale funzione è già esistente
nelle librerie del compilatore, ad esempio il turbo c comprende già nelle sue librerie la
funzione inportb()... ti consiglio anche di inizializzare velocità parità ecc. della porta
utilizzata e ricorda il metodo (questo) che utilizza il polling non è mai preciso e la
possibilità di perdere dei caratteri è sicura, con qualche riga di codice in + è possibile
utilizzare l'interruzione, è però consigliabile darsi una guardata ai vari registri
disponibili sulla seriale e utilizzare le funzioni setvect() e getvect() ( o simili,
dipende dal compilatore e dal sistema operativo che utilizzi perchè non sono fuzioni
standard ) per gestire il vettore di interruzione...   Salutoni  a Tutti Dave.

 disponibili sulla seriale e utilizzare le funzioni setvect() e getvect()


 o sulla comunicazione in seriale di programmi C?
Prova ad effettuare una riceca con google, qualcosa salterà fuori sicuramente io
purtroppo non ho + a disposizione documentazione di questo tipo ma dovrebbe
essermi rimasto in giro da qualche parte un semplice programmino che avevo
scritto diversi anni passati che consisteva fondamentalmente in un terminale con
il quale ci si scambiava messaggi da un pc ad un altro che utilizzava le
interruzioni, se ti interessa posso postartelo sul new perche in pvt non posso
postare :-(, almeno puoi farti una minima idea di come funzioni il sitema...
Ciao Dave.

Se puoi farmi il favore di postarlo sul newsgroup  te ne sarei grato.
Grazie , Pallade.
Dave <Dave@Questo!Indirizzo!Non!Esiste.it> wrote in message
Zk58a.344793$AA2.12...@news2.tin.it...


 Grazie , Pallade.
Stasera lo cerco e domani lo posto... Salutoni Dave.

 Grazie , Pallade.
L' ho trovato :-) ora speriamo solo che funzioni..., a memoria ho difficoltà a
ricordare le funzionalità dei vari registri per cui non prendere come oro colato
i vari commenti perchè ho dovuto riordinarli  visto che erano 'scarsi' e mal
posizionati, sintatticamente sembra a posto, ti ricordo soltanto che il codice
non è assolutamente trasportabile e il tutto deve essere compilato con
compilatore turbo c in mancaza del quale devi sostituire parecchie funzioni con
quelle a disposizione del tuo... ( se disponobili ), questo è un piccolo esempio
di terminale ristretto al massimo che scritto parecchi anni passati per cui ogni
commento e suggerimento sono ben accetti visto che non ricordo + se tutto è
sitemato nella maniera corretta... Salutoni a tutti Dave.
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#define PORT 0x3f8      /*Indirizzo della porta che utilizzo */
#define INTVECT 0x0C    /* Com Port IRQ */
int bufin = 0;
int bufout = 0;
unsigned char ch;
unsigned char buf[1025];
void interrupt (*opisr)();
void interrupt npisr()    /* Interrupt Service Routine (ISR) */
{
  unsigned char chr;
  do
   {
     chr = inportb(PORT + 5);
     if (chr & 1)
      {
 buf[bufin] = inportb(PORT);
 bufin++;
 if (bufin == 1024) bufin = 0;
      }
   }while (chr & 1);
   outportb(0x20,0x20);
}
int main(int argc, char *argv[])
{
  int c;
  outportb(PORT + 1 , 0);       /* Disattiva interruzione sulla porta */
  opisr = getvect(INTVECT);     /* Salva il vettore di interruzione   */
  setvect(INTVECT, npisr);      /* Installa il nuovo vettore di interruzione */
       /* COM1 - 0x0C */
       /* COM2 - 0x0B */
       /* COM3 - 0x0C */
       /* COM4 - 0x0B */
 outportb(PORT + 3 , 0x80);       /* DLAB ON */
 outportb(PORT + 0 , 0x30);       /* Baud rate - Divisor Latch Low Byte
          Default 0x03 = 38,400 BPS
          0x01 = 115,200 BPS
          0x02 = 56,700 BPS
          0x06 = 19,200 BPS
          0x0C = 9,600 BPS
          0x18 = 4,800 BPS
          0x30 = 2,400 BPS */
 outportb(PORT + 1 , 0x00);       /* Baud rate - Divisor Latch High Byte */
 outportb(PORT + 3 , 31);         /* 8 Even bitstop 2*/
 outportb(PORT + 4 , 0x0b);             /* livello 1 DTR, RTS, */
 outportb(0x21,(inportb(0x21) & 0xef)); /* Setta il PIC        */
     /* COM1 (IRQ4) - 0xEF
        COM2 (IRQ3) - 0xF7
        COM3 (IRQ4) - 0xEF
        COM4 (IRQ3) - 0xF7  */
 outportb(PORT + 1 , 0x01);             /* Genera interruzione quando
        riceve un dato      */
 printf("\nTerminale Premi Esc per uscire. \n");
 do
  {
    if (bufin != bufout)
     {
       ch = buf[bufout];
       bufout++;
       if (bufout == 1024) bufout = 0;
       printf("%c",ch);
     }
    if (kbhit())
     {
       c = getch();
       outportb(PORT, c);
     }
  } while (c !=27);                     /* termina con il taso esc  */
 outportb(PORT + 1 , 0);                /* Disattiva l'interruzione */
 outportb(0x21,(inportb(0x21) | 0x10)); /* MASK IRQ con PIC
        COM1 (IRQ4) - 0x10
        COM2 (IRQ3) - 0x08
        COM3 (IRQ4) - 0x10
        COM4 (IRQ3) - 0x08 */
 setvect(INTVECT, opisr);               /* Ripristina il vecchio vettore
        di interruzione    */
 return 0;
}