Comunicazione seriale
Gestione ad eventi
a cura di Marco Zucchini
L’Handshake
Le proprietà principali dell’oggetto
Comm
•
•
•
•
•
Handshaking
Rthereshold
CommEvent
DTREnable
RTSEnable
Proprietà Handshaking
• Imposta (e restituisce) il tipo di protocollo di
sincronia hardware.
• Un protocollo di sincronia garantisce che i dati
non vadano perduti per un overrun del buffer, che
si verifica quando i dati arrivano alla porta troppo
rapidamente perché la periferica di comunicazione
riesca a spostarli nel buffer di ricezione
• Esempio
MSComm1.Handshaking=2
Imposta il protocollo alla modalità RTS/CTS
Proprietà Handshaking
Costante
Valore
Descrizione
comNone
0
Default. Nessun handshaking.
comXOnXOff
1
Handshaking di tipo XOnXOff.
comRTS
2
Handshaking di tipo RTS/CTS
comRTSXOnXOff
4
Handshaking di tipo RTS/CTS + XOnXOff.
Gestione dell’Input
Proprietà RThereshold
• Imposta (e restituisce) il numero di caratteri
che devono essere ricevuti nel buffer di
input prima che l’oggetto MSComm :
– generi un evento di tipo OnComm
– la proprietà CommEvent venga impostata al
valore comEvReceive
Esempi
MSComm1.Rthereshold=1
• In questo caso l’evento OnComm viene
generato ad ogni carattere ricevuto.
MSComm1.Rthereshold=0
• In questo caso viene impedita la
generazione dell’evento OnComm.
Processo Consumatore
Esempio
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
R
M
S
I_BUF
M
2
If (MSComm1.CommEvent = 2) Then
‘ inserire codice per gestione evento
3
2
Private Sub MSComm1_OnComm()
End If
O_BUF
End Sub
Proprietà CommEvent
• Contiene il codice associato al tipo di
– evento di comunicazione
– errore di comunicazione
generato.
Nota: proprietà non disponibile in fase di
progettazione
Eventi di comunicazione
Costante
Valore
CommEvent
Descrizione
comEvSend
1
Nel buffer di trasmissione ci sono meno caratteri
di quanti impostati dalla proprietà Sthreshold
comEvReceive
2
Ricevuti tanti caratteri quanti impostati dalla
proprietà Rthreshold. Questo evento è generato
continuamente fintanto che non viene
completamente svuotato il buffer di input.
comEvCTS
3
Segnala un avvenuto cambiamento di stato della
linea CTS
comEvDSR
4
Segnala un avvenuto cambiamento di stato della
linea DSR
Eventi
“condizione di errore di comunicazione”
Costante
Valore
CommEvent
Descrizione
comEventOverrun
1006
Errore Overrun. Perdita del penultimo carattere.
Non è stato possibile leggere un carattere prima
dell’arrivo del carattere successivo.
comEventRxover
1008
Overflow nel buffer di ricezione. Segnala che il
buffer di ricezione è pieno.
comEventRxParity
1009
Errore di Parità individuato dal sispositivo
hardware.
comEventTxFull
1010
Segnala che il buffer di trasmissione è pieno.
Private Sub MSComm2_OnComm()
Select Case MSComm2.CommEvent
Case 1
‘ Signal Send Event
MSComm2.Output=“A”
Case 2
‘ Signal Receive Event
MSComm2.InputLen = 0
txtDisplay2.Text = txtDisplay2.Text + MSComm2.Input
Case 3
‘ Signal Clear To Send
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line CTS Clear to Send" + vbCrLf
Case 4
‘ Signal Data Set Ready
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line DSR" + vbCrLf
Case Else
‘ All other Signal
txtDisplay2.Text = txtDisplay2.Text + "General Event Signal Detected on COM2 !!!" + vbCrLf
End Select
End Sub
Gestione dei segnali
DSR/RTS
Proprietà DTREnable
• Abilita o disabilita la linea DTR
Esempio
MSComm1.DTREnable=True
oppure
MSComm1.DTREnable=False
Osservazione: sulla porta ricevente genera un segnale DSR
Generazione segnale DTR
• Si implementa nel seguente modo.
If (MSComm1.DTREnable=True) Then
MSComm1.DTREnable=False
Else
MSComm1.DTREnable=True
End If
Private Sub MSComm2_OnComm()
Select Case MSComm2.CommEvent
Case 1
‘ Signal Send Event
MSComm2.Output=“A”
Case 2
‘ Signal Receive Event
MSComm2.InputLen = 0
txtDisplay2.Text = txtDisplay2.Text + MSComm2.Input
Case 3
‘ Signal Clear To Send
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line CTS Clear to Send" + vbCrLf
Case 4
‘ Signal Data Set Ready
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line DSR" + vbCrLf
Case Else
‘ All other Signal
txtDisplay2.Text = txtDisplay2.Text + "General Event Signal Detected on COM2 !!!" + vbCrLf
End Select
End Sub
Proprietà RTSEnable
• Abilita o disabilita la linea RTS
Esempio
MSComm1.RTSEnable=True
oppure
MSComm1.RTSEnable=False
Osservazione: sulla porta ricevente genera un segnale CTS
Generazione segnale RTS
• Si implementa nel seguente modo.
If (MSComm1.RTSEnable=True) Then
MSComm1.RTSEnable=False
Else
MSComm1.RTSEnable=True
End If
Private Sub MSComm2_OnComm()
Select Case MSComm2.CommEvent
Case 1
‘ Signal Send Event
MSComm2.Output=“A”
Case 2
‘ Signal Receive Event
MSComm2.InputLen = 0
txtDisplay2.Text = txtDisplay2.Text + MSComm2.Input
Case 3
‘ Signal Clear To Send
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line CTS Clear to Send" + vbCrLf
Case 4
‘ Signal Data Set Ready
txtDisplay2.Text = txtDisplay2.Text + "Signal detected on line DSR" + vbCrLf
Case Else
‘ All other Signal
txtDisplay2.Text = txtDisplay2.Text + "General Event Signal Detected on COM2 !!!" + vbCrLf
End Select
End Sub
Esercizio di verifica
Scrivere due applicazioni VB che dopo aver impostato gli stessi
valori dei parametri di comunicazione seriale (“9600,N,8,1”),
consentano:
I applicazione (GeneraSegnali)
II applicazione (Monitor)
•
•
•
•
•
•
•
•
•
•
Gestione porta COM1
L’impostazione protocollo
L’apertura/chiusura porta
L’invio segnali DSR e RTS
La sua terminazione (END)
Gestione porta COM2
L’impostazione protocollo
L’apertura/chiusura porta
La visualizzazione dei segnali catturati
La sua terminazione (END)
Dopo aver avviato l’applicazione Monitor avviare GeneraSegnali
ed effettuare le operazioni consentite da quest’ultima nella
casistica più ampia possibile. Riportare nella tabella a seguito i
segnali catturati e visualizzati di volta in volta da Monitor.
Precondizione
GS
Running
HS
NO
Azione
HS
RTS
Star
t GS
Satop
GS
Port
Open
Segnale Catturato
Port
Close
CTS
DSR
Scarica

PPT