|
 |
Procedure Seriali |
RxD_0 essenziale
[185 di 403] |
- Gestione della
Ricezione Dati con la Tecnica del Polling |
|
4.1 Procedura
RxD_0:
Versione essenziale |
 | La Ricezione
dei dati
via seriale con questa Tecnica è certamente
una situazione
critica; non sempre il processore può
permettersi di
interrogare (Polling)
l'UART in attesa
delle condizioni ottimali, cioè dell'istante in cui il Buffer
di Ricezione Dati è pieno
e quindi è possibile prelevare il nuovo dato:
 | poichè i dati arrivano dalla linea in continuazione, se
la ricezione è veloce il tempo
necessario per la verifica dello stato
dell'UART, tra un
polling e il successivo, potrebbe essere sufficiente per provocare la
perdita di qualche dato |
 | in aggiunta c'è il rischio (molto
frequente) di vedersi bloccare il computer se il processore
dovesse stare in attesa di dati seriali che non arrivano... |
|
 |
Per questa ragione nessuna delle proposte
basate sulla tecnica del Polling è veramente affidabile
al 100%: possono essere utilizzate solo con la consapevolezza dei loro limiti;
sebbene sia certamente più complessa, la
Tecnica d'Interruzione
garantisce una ricezione più
sicura.
|
 | In ogni caso in nessun modo sarà possibile gestire una
Ricezione dati senza prima aver fissato le specifiche
di Ricetrasmissione (la velocità e i parametri
desiderati per il protocollo HW, dimensione dei dati, il
numero di bit di stop ed
eventualmente
di parità) in accordo con quelle concordate con
il Trasmettitore, compito delegato alla procedura INIserial, descritta
nelle pagine precedenti. |
 | Il codice necessario
per Ricevere un
dato via seriale è mostrato qui di seguito, nella sua versione
essenziale (procedura
RxD_0), con riferimento alla porta
COM1: |
 | Si può notare che la procedura
si ferma in un loop d'attesa: la verifica del
bit di stato è assicurata dall'istruzione
TEST,
che simula l'operazione
AND tra
AL e 00000001 il cui risultato
è zero solo se
bit0=0,
condizione che obbliga (JZ) a
rimanere in attesa. |
 | In pratica si attende che il
bit0 del
Registro
di Stato Linea [port_D]
passi a 1; questo evento si manifesta
quando un nuovo dato è stato
completamente
ricostruito dal registro a scorrimento
interno e da esso è stato trasferito
nel
Registro
di Ricezione
[port_8] (o
nel
buffer FIFO in
Ricezione, con UART
16550A), cioè in condizioni di
buffer UART
pieni. |
 | In queste condizioni
il dato ricevuto deve
essere immediatamente letto con l'istruzione di
IN
dal Registro
di Ricezione (o dal FIFO),
operazione che riporta automaticamente di nuovo a
0 il
bit0 del
Registro
di Stato, fino a quando l'UART
avrà un
nuovo carattere pronto. |
 | Se il dato non viene
rimosso prima che un altro carattere sia ricevuto completamente dall'UART
viene perduto, sovrascritto da quello in arrivo; la situazione
(errore di sovrapposizione)
è segnalata forzando a 1
il
bit1 del
medesimo
Registro
di Stato Linea. |
 | Questa versione è sufficientemente affidabile,
adatta per una ricezione gestita in polling con
qualunque protocollo hardware e con
velocità relativamente basse (cose impostate dal
programma principale tramite la procedura
INIserial), in un contesto che assicuri un
flusso continuo di
dati in arrivo: non essendo prevista alcuna verifica di
Time-Out, nell'impossibilità di assumere dati dalla porta
seriale non
sarà possibile tornare al programma
chiamante ed essa si bloccherà in attesa!! |
 | Ne fa uso il progetto
RxD0Com1, dedicato alla
COM1, e l'analogo
RxD0Com2, dedicato alla
COM2; puoi analizzare ogni dettaglio
partendo dall'elenco di
questa pagina. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|