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