Quinta Esercitazione (Porta parallela e porta seriale)

Esercizio 1 (Porta parallela)
Esercizio 2 (Porta seriale)

Prototipi delle funzioni di apertura, scrittura e lettura da device (vedi manual online -> man)
  #include <fcntl.h>
  int open(const char *pathname, int flags);

  #include <unistd.h>
  ssize_t read(int fd, void *buf, size_t count);
  ssize_t write(int fd, const void *buf, size_t count);


Esercizio 1
L'esercizio consiste nell'attivare otto linee digitali (associate a led) attraverso la scrittura, nel device associato alla porta parallela, di un intero a 8 bit (=1 byte = char).

#include<fcntl.h>
#include<unistd.h>

  int fd;
  char c[1];

  fd = open("/dev/pp0",O_WRONLY);

  ...
  write(fd,c,1);
  ...

  close(fd);
Per vedere in esadecimale il valore di un numero intero:
  cout << hex << i << endl;
Provate diverse sequenze di accensione e spegnimento dei led.

Esercizio 2
Dopo aver collegato il multimetro digitale alla porta seriale si imposti la misura (comando composto dalla singola lettera d) e si legga il risultato (il multimetro risponde inviando la misura effettuata all'istante del comando e quelle nei tre secondi precedenti).
Ad esempio (resistenza)

-12345678901234-
 XX 7.345 uu
    7.341  
    7.344  
    7.344  
dove XX identifica il tipo di misura (OH=resistenza DC=misure in corrente continua) e uu l'unità di misura.
Schema:
#include<fcntl.h>
#include<unistd.h>
#include<serial.h>

...

  char buf[14];
  int i;

  sid = open("/dev/ttyS0",O_RDWR);
  if (sid>0){
    setserspeed(sid,9600);
  } else {
    ...
  }

  for ( ){ // ciclo sul numero di misure 
    write(sid,"d\n",2);
    usleep(500000);
    val = lettura(tipo);
    sleep(1);
  }
  ...
  close(sid);

...
La funzione lettura sarà molto utile per le prossime due esercitazioni: vi consigliamo quindi di realizzarla e provarla con cura per risparmiare tempo nelle prossime esercitazioni.
Per tale funzione vi consigliamo il prototipo:
double lettura(string tipo){
  double val=-999; //valore di default nel caso in cui la lettura non vada a buon fine
  for (i=0;i<4;i++){
    read(sid,buf,14); // per i=0 il buffer contiene il valore della misura (per i=1,2,3
                         i valori a -1,-2,-3 sec)
    ...
  }
  return val;
}
Dopo la chiamata a read occorrerà procedere alla codifica: se questi controlli falliscono occorre segnalarlo all'utente l'errore in modo che agisca di conseguenza sul multimetro.
Letto il valore questo dovrà essere convertito in unità SI.
Facoltativo (ma utile): calcolo automatico dell'errore.

Strumenti utili per la lettura:

Per compilare il secondo esercizio
 
> g++ -o eseguibile sorgente.cpp -l serial
INFN Genova privacy policy