Porta seriale e parallela

Documenti analoghi
A.1 Programma di comunicazione su porta seriale

System calls. permettono ai programmi utente di richiedere servizi al Sistema Operativo. servizi come scrittura di file, stampa su video, ecc.

Igino Corona

Laboratorio di Sistemi Operativi

Digressione: man 2...

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

Concetti base di acquisizione dati

Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)

File I/O. M. R. Guarracino: File I/O 1

Capitolo 5 -- Stevens

Directory. Le directory unix sono file.

Laboratorio di Calcolo B 100

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/2012

5. I device driver. Device driver - gestori delle periferiche. Struttura interna del sistema operativo Linux. Tipi di periferiche. Tipi di periferiche

Indice. La gestione dei file in C e gli stream. Apertura e chiusura di un file. Operazioni sui file. Accesso sequenziale e non sequenziale

LABORATORIO di Reti di Calcolatori

Comandi. Sistema Operativo

File binari e file di testo

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Per operare su un file abbiamo bisogno di aprirlo, scriverlo, leggerlo, chiuderlo:

void char void char @param void int int int int

CAP9. Device drivers

Struttura interna del sistema operativo Linux

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione dei file di dati

Chiamate di sistema. Pipe Flussi di I/O

Laboratorio di Informatica Ingegneria Clinica Lezione 30/11/2011

Gestione di files Motivazioni

4. Accesso diretto per gli archivi con record a lunghezza costante

Sistemi operativi Modulo II I semafori 2 Select

Bus RS-232. Ing. Gianfranco Miele April 28, 2011

Programmazione di sistema in UNIX. Immagine di un processo in UNIX. Area dati. File comandi utente

Programmazione di sistema in Linux: gestione dei file. E. Mumolo

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

ESERCIZI RISOLTI IN C LANGUAGE (programmazione avanzata)

OPEN DRIVE OPEN DRIVE

Input / Output attraverso stream. I/O in C vs. I/O in C++

ingresso/uscita da file

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3. 1 strace : visualizzazione delle system call invocate da un processo

Sistemi Operativi Teledidattico

Corso di programmazione Arduino DI MALVEZZI DAVIDE

I/O su Socket TCP: read()

Contenuti: 1. Strumenti per il debugging nel Kernel LINUX: printk() e panic()

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Lezione 8 Struct e qsort

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Laboratorio di Sistemi Operativi

Perché il linguaggio C?

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

Uno stream rappresenta un flusso di dati da cui e' possibile

Esercizio sulla gestione di file in Unix

La Comunicazione tra Processi in Unix

CREAZIONE DI UN FILE

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Sistemi Operativi (M. Cesati)

UNIX file system: organizzazione logica. Il File System di UNIX. UNIX file system: organizzazione fisica

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

SC per Inter Process Comminication. Pipe senza nome e con nome (FIFO)

INTERPROCESS COMMUNICATION 27

1. Soluzione esercizio XYZ SpA

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Passare argomenti al programma

Introduzione al C++ (continua)

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Esercitazione [5] Input/Output su Socket

PhoneTime. Introduzione e Installazione...2 Avvio di PhoneTime...3 Impostazioni e configurazione dispositivi...4 Specifiche Tecniche...

Corso di Sistemi Operativi Esercitazioni

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Specifiche del protocollo di comunicazione semplificato per il modulo seriale di I/O

Funzioni di libreria. Richiedono tutte. #include <math.h> fabs(x) sqrt(x) pow(x,a) exp(x) log(x)

Interfacciamento di periferiche I/O al μp 8088

Corso di Programmazione ad oggetti

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Informatica! Appunti dal laboratorio 1!

Istruzioni per l uso DPS16 Ver.1.0.0

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

Esercizi Programmazione I

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

Laboratorio di Sistemi Operativi primavera 2009

8. IL FILE SYSTEM. 1. I servizi per la gestione dei file

Esercizi svolti e da svolgere sugli argomenti trattati nella lezione 25

Il protocollo RS Introduzione. 1.2 Lo Standard RS-232

Grammatica di base: Pointers

I files in C. A cura del prof. Ghezzi

Esercitazione 11. Liste semplici

Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file:

Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0

Caratteristiche di un PC

Introduzione alla programmazione in C

Protocollo seriale SX 16 EXT - RF

Opera Crate Monitor Software Reference Manual V2.0

MANUALE DI INSTALLAZIONE

Il registratore digitale

System Calls per la Gestione dei Processi

Transcript:

1 / 24

La porta la posta sono semplici dispositivi di connessione dei computer con dispositivi esterni. Vengono principalmente utilizzate per stampanti, mouse, tastiere. Sono tuttavia spesso usate anche per il collegamento di dispositivi di misura e controllo (ad es. multimetri). La porta consiste essenzialmente di due linee digitali, una dal computer al dispositivo ed una dal dispositivo al computer (più un certo numero di linee di controllo); può essere trasmesso un solo bit alla volta. La porta consiste invece di un certo numero di linee dati e di controllo [tre registri di memoria a 8-bit: DATA (8 bit disponibili), CONTROL (bit 0-3 disponibili) e STATUS (bit 3-7 disponibili)], che consentono quindi il trasferimento di più bit per volta permettendo quindi la realizzazione di semplici circuiti pilotatibili tramite PC. 2 / 24

Comunicazione con i devices La comunicazione con i devices è particolarmente naturale in ambiente Linux secondo la filosofia Everything is a file open #include <fcntl.h> int open(const char *pathname, int flags); pathname: /dev/ttysx () /dev/parportx () (X = 0,..,N porte 1) flags: O_RDWR, O_RDONLY, O_WRONLY,... Il valore di ritorno è un intero (il più basso disponibile) che identifica univocamente il file (file descriptor) se il file (o device) esiste ed è accessibile, -1 altrimenti. close #include <unistd.h> int close(int fd); 3 / 24

di utilizzo generale ioctl #include <sys/ioctl.h> int ioctl(int fd, int command,...); La funzione ioctl manipola i parametri dei devices ; in particolare molte loro caratteristiche operative possono essere controllate specificando command (dipendente dal device); fd è il file descriptor. Il terzo argomento (se esistente) è un puntatore a memoria di tipo non specificato (tipicamente un char *argp). La caratteristiche (e la presenza!) del terzo parametro dipendono dal tipo di comando. Valore di ritorno: 0 in caso di successo, -1 in caso di errore. Per informazioni dettagliate su tutte queste funzioni di sistema date il comando, da linea di terminale: man funzione 4 / 24

di utilizzo generale write #include <unistd.h> int write(int fd, const void *buf, int n); Scrive n bytes nel file fd copiandoli dalla memoria a partire dal puntatore buf. In caso di successo il numero di bytes scritti è restituito come valore di ritorno; in caso di errore il valore di ritorno è -1. open #include <unistd.h> int read(int fd, void *buf, int n); Legge n bytes dal file fd in memoria a partire dal puntatore buf. In caso di successo il numero di bytes letti è restituito come valore di ritorno; in caso di errore il valore di ritorno è -1. 5 / 24

: configurazione 6 / 24 Il driver per la porta è caricato automaticamente, per poter accedervi è necessario abilitare i permessi necessari con chmod utente+permessi nomefile come per un qualsiasi file (l utente può essere u (user), g (group), a (all), i permessi r (read) w (write) x execute) Dopo aver aperto le comunicazioni con la porta (open) è necessario specificare le modalità di comunicazione (velocità, numero di bit, etc...). Ciò viene fatto assegnando il valore dei membri della struttura termios struttura termios #include <termios.h> structure termios{ unsigned int c_iflag; /* input modes */ unsigned int c_oflag; /* output modes */ unsigned int c_cflag; /* control modes */ unsigned int c_lflag; /* local modes */ char c_cc[nccs]; /* control chars */ }

: configurazione (II) 7 / 24 (Alcune) opzioni per la modalità di input c_iflag: IGNBRK ignora condizione di break (segnale di condizioni anomale) IGNPAR ignora errori di parità (Alcune) opzioni per la modalità di controllo c_cflag: CREAD abilita la ricezione CLOCAL ignora le linee del modem CS5,CS6,CS7,CS8 setta il numero di bit da trasmettere PARODD seleziona parità dispari CSTOPB setta a due gli stop bits (default uno) Ogni modo può essere settato componendo, con operazioni bit a bit, varie opzioni (la maggior parte delle label corrisponde ad un intero con un solo bit a 1). Per settare la velocità di trasmissione (in input e in output) int cfsetispeed(struct termios *termios_p, int speed); int cfsetospeed(struct termios *termios_p, int speed); speed=bxxxx (dove XXXX è il valore della velocità in baud)

: configurazione (III) Una volta assegnati i valori desiderati alla struttura termios questa viene usata per configurare il device utilizzando la funzione int tcsetattr(int fd, int opt, struct termios *term); opt: TCSANOW: la modifica ha effetto immediato... 8 / 24

Metex MXD-4660 9 / 24 Configurazione tipo di segnale: 7n2 velocità di comunicazione: 9600 baud bit di controllo di flusso RTS settato a zero (non standard, in realtà l apparecchio non utilizza il controllo di flusso ma la tensione corrispondente serve per alimentare le linee di trasmissione). Comando di misura Scrittura della stringa d\n (2 caratteri) nel device Lettura Il device fornisce in output 4 array di 14 caratteri nel formato 01234567890123 TT xxxxxx uu Es.: DC 0.0121 mv 0.0122 0.0123 0.0124

Metex MXD-4660: esempio di programma per l acquisizione (I) void init_metex(int fd){ int status; struct termios term; // crea variabile di tipo termios term.c_oflag = 0; //...ne assegna i membri term.c_lflag = 0; term.c_iflag = IGNBRK IGNPAR; term.c_cflag = CREAD CLOCAL...; cfsetispeed(&term,...); cfsetospeed(&term,...); tcsetattr(fd,tcsanow,&term); // assegna la struttura al file ioctl(fd,tiocmget,&status); // chiede stato linee di controllo status &= ~TIOCM_RTS; // setta RTS a 0 ioctl(fd,tiocmset,&status); // setta stato linee di controllo } 10 / 24

Metex MXD-4660: esempio di programma per l acquisizione (II) 11 / 24 int main(){ int fd; fd = open("/dev/ttys0",o_rdwr); // apertura if (fd<0){... // messaggio di errore return 1; } init_metex(fd); // set della modalita di comunicazione string command="d\n"; // definizione del comando di misura write(fd,...,...); // invio del comando di misura char buf[14]; for (int i=0;i<4;i++){ read(fd,...,...); // lettura dei dati if (i==0){ string sbuf(buf,14); //... lettura del risultato... } } close(fd);... } N.B. Mancano gli #include opportuni, individuateli con l ausilio di man.

Classe stringa e utilizzo delle classi di I/O per le stringhe (I) Utili metodi della classe stringa string substr(int firstchar, int nchar); int find(const string&str); Es.: string str = "bbbaa"; cout << str.substr(0,3) << endl; int pos = str.find("aa"); cout << pos << endl; pos = str.find("c"); if (pos == string::npos) cout << "Not found" << endl; 12 / 24

Classe stringa e utilizzo delle classi di I/O per le stringhe (I) Utili metodi della classe stringa string substr(int firstchar, int nchar); int find(const string&str); Es.: string str = "bbbaa"; cout << str.substr(0,3) << endl; int pos = str.find("aa"); cout << pos << endl; pos = str.find("c"); if (pos == string::npos) cout << "Not found" << endl; bbb 13 / 24

Classe stringa e utilizzo delle classi di I/O per le stringhe (I) Utili metodi della classe stringa string substr(int firstchar, int nchar); int find(const string&str); Es.: string str = "bbbaa"; cout << str.substr(0,3) << endl; int pos = str.find("aa"); cout << pos << endl; pos = str.find("c"); if (pos == string::npos) cout << "Not found" << endl; bbb 3 14 / 24

Classe stringa e utilizzo delle classi di I/O per le stringhe (I) Utili metodi della classe stringa string substr(int firstchar, int nchar); int find(const string&str); Es.: string str = "bbbaa"; cout << str.substr(0,3) << endl; int pos = str.find("aa"); cout << pos << endl; pos = str.find("c"); if (pos == string::npos) cout << "Not found" << endl; bbb 3 Not found 15 / 24

Classe stringa e utilizzo delle classi di I/O per le stringhe (II) Classi di I/O per le stringhe istringstream (analogo a ifstream) #include <sstream> string str;... istringstream inputstring(str); inputstring >>...; ostringstream (analogo a ofstream) #include <sstream> ostringstream outputstring; outputstring <<...; string str=outputstring.str(); Es.: double val; string tipo,unit,buf = "DC 0.0121 mv"; istringstream is(buf); is >> tipo >> val >> unit; cout << val << endl; ostringstream os; os << tipo << " " << val << " " << unit; cout << os.str() << endl; 16 / 24

Classe stringa e utilizzo delle classi di I/O per le stringhe (II) Classi di I/O per le stringhe istringstream (analogo a ifstream) #include <sstream> string str;... istringstream inputstring(str); inputstring >>...; ostringstream (analogo a ofstream) #include <sstream> ostringstream outputstring; outputstring <<...; string str=outputstring.str(); 17 / 24 Es.: double val; string tipo,unit,buf = "DC 0.0121 mv"; istringstream is(buf); is >> tipo >> val >> unit; cout << val << endl; ostringstream os; os << tipo << " " << val << " " << unit; cout << 0.0121 os.str() << endl;

Classe stringa e utilizzo delle classi di I/O per le stringhe (II) Classi di I/O per le stringhe istringstream (analogo a ifstream) #include <sstream> string str;... istringstream inputstring(str); inputstring >>...; ostringstream (analogo a ofstream) #include <sstream> ostringstream outputstring; outputstring <<...; string str=outputstring.str(); 18 / 24 Es.: double val; string tipo,unit,buf = "DC 0.0121 mv"; istringstream is(buf); is >> tipo >> val >> unit; cout << val << endl; ostringstream os; os << tipo << " " << val << " " << unit; cout << 0.0121 DC 0.0121 mv os.str() << endl;

Esercitazione in laboratorio: porta Predisporre le seguenti funzioni per l acquisizione del multimetro tramite void init_metex(int fd); double get_metex(int fd, string tipo); o facoltativamente void get_metex(int fd, string tipo, double &mis, double& err); ed utilizzatele per misurare il valore di una resistenza, di una tensione, etc... La funzione get metex deve controllare che il multimetro sia effettivamente configurato per fare la misura richiesta (tipo) e deve convertire il risultato in unità S.I. (per l eventuale calcolo dell errore fate riferimento al manuale dello strumento). Per sicurezza (in assenza di controllo di flusso) è bene far intercorrere 0.2s tra scrittura e lettura Utilizzate le funzioni: void sleep(int secondi) e void usleep(int microsecondi). 19 / 24

(I) Il driver ppdev per la porta /dev/parport0 non è solitamente caricato automaticamente. Per caricare in memoria (attuando alcuni test per la configurazione automatica) un modulo aggiuntivo al kernel (nucleo) di linux occorre (da utente root) dare il comando modprobe nome_modulo ed in questo caso il comando è modprobe parport_pc && modprobe ppdev I comandi lsmod e rmmod listano e rimuovono rispettivamente i moduli aggiunti al kernel. 20 / 24

(II) Il driver ppdev supporta (tra le altre) le funzioni standard open, close, ioctl. In particolare, ricordiamo che ioctl prende come parametri il file descriptor, un comando, e (opzionalmente) il puntatore a qualche dato. Alcuni comandi possibili sono: PPCLAIM richiede accesso alla porta. Necessario prima di riuscire ad operare sulla porta. PPWXXXX setta i bit della linea XXXX. Il parametro è un puntatore ad un unsigned char. PPRXXXX legge i bit della linea XXXX. Il parametro è un puntatore ad un unsigned char. dove XXXX=(DATA,CONTROL,STATUS). Per STATUS non c e il comando di lettura. 21 / 24

(II) Nell esercitazione di laboratorio ogni bit della linea dati (DATA) è collegato ad un led: bit a 1 led acceso bit a 0 led spento Il registro dati ha 8 bit tutti disponibili per la scrittura (e la lettura): 0xff tutti i led accesi 0x00 tutti i led spenti 22 / 24

Esempio di programma per pilotare la porta in scrittura int main() { int fd; fd = open("/dev/parport0",o_wronly); if (fd == -1){... // messaggio di errore return 1; } if (ioctl(fd,ppclaim)){... // messaggio di errore return 1; } unsigned char ch=...; ioctl(fd,...,...); close(fd)... } // apertura // accesso alla porta // scrittura 23 / 24 N.B. Mancano gli #include opportuni, individuateli con l ausilio di man.

Esercitazione in laboratorio: porta Modificate il programma in modo da eseguire seguenze di spegnimento/accensione (da destra a sinistra e viceversa). Utilizzate per tale scopo gli operatori bitwise di shift (<< e >>). È utili utilizzare brevi pause tra una scrittura e l altra (sleep e usleep) in modo da avere il tempo di visualizzare l effetto. N.B. Per stampare un numero in formato esadecimale unsigned char num; cout << hex << num << endl; per ritornare in modo decimale cout << dec; 24 / 24