1 - itis galileo galilei conegliano

Transcript

1 - itis galileo galilei conegliano
Nuova pagina 1
1 of 7
http://ennius.interfree.it/vba/vba89.htm
Stampa questa pagina
Controllo comunicazioni MSCOMM32.OCX per comunicare col Modem e/o chiamare numeri
telefonici.
Premetto che non ho nè provato, nè intendo farlo, ad usare le istruzioni che seguono per eseguire chiamate a
numeri telefonici, ma spinto da alcune richieste ricevute, provo a segnalare ai "volenterosi" queste istruzioni
: se ne avranno voglia, si cimenteranno nel seguirle.
Fornisco comunque alcune considerazioni di massima:
per telefonare dal computer è necessario un Modem ed una porta di connessione al modem: la COM1
o la COM2. Inoltre il Modem deve essere munito dei ModemAudioDevice, driver che in genere
vengono installati dal Sistema Operativo al momento del riconoscimento del Modem stesso, insieme
ai driver del modem.
Perchè Excel possa utilizzare il "controllo" per comunicare, dovrà essere inserito nella UserForm.
Trattandosi di un "controllo" OCX, dovremo, nell'editor di visual basic, scegliere dal menù
"Strumenti" e poi "Riferimenti" - In questa finestra dovremo premere sul pulsante "Sfoglia", si aprirà
la finestra "Aggiungi riferimento": qui dovremo selezionare in "Tipo di file", il tipo ocx (Controlli
ActiveX *.ocx). A questo punto nella zona centrale cercheremo e selezioneremo MSCOMM32.OCX,
che è il controllo che serve. Daremo OK, OK, e troveremo il nostro controllo "caricato" nella "casella
degli strumenti" della UserForm.
A questo punto selezioneremo il "controllo" nella casella degli strumenti e spostandoci sulla UserForm,
trasciniamo fino ad ottenere l'icona del controllo inserito (in esecuzione il controllo non è visibile). Questa
l'immagine che vedremo:
e questa l'immagine della finestra delle "proprietà" del controllo:
26/02/2007 18.09
Nuova pagina 1
2 of 7
http://ennius.interfree.it/vba/vba89.htm
Passiamo alle spiegazioni trovate su un libro:
Controllo comunicazioni MSCOMM32.OCX
Il controllo comunicazioni consente di aggiungere nell'applicazione funzioni semplici per comunicazioni
attraverso porte seriali nonché funzioni avanzate per la creazione di uno strumento di comunicazione
completo basato su eventi.
Il controllo comunicazioni
MSCOMM32.OCX
Il controllo comunicazioni fornisce un'interfaccia a un gruppo di comandi di comunicazione standard e
consente di stabilire una connessione a una porta seriale, di connettersi a un'altra periferica di
comunicazione, ad esempio un modem, di inviare comandi, di scambiare dati nonché di eseguire il
monitoraggio e rispondere ai vari eventi ed errori generati durante una connessione seriale.
Esempi di utilizzo
Composizione di numeri telefonici
Monitoraggio di una porta seriale per il controllo di dati in entrata
Creazione di programmi per terminale completi
Nozioni fondamentali sulle comunicazioni seriali
In tutti i computer sono disponibili una o più porte seriali COM1, COM2 e così via. In un PC standard il
mouse è in genere collegato alla porta COM1, un modem alla porta COM2, uno scanner alla porta COM3 e
così via. Le porte seriali rappresentano il canale di trasmissione dei dati inviati attraverso queste periferiche
seriali esterne.
La funzione fondamentale della porta seriale consiste nell'agire da interprete tra la CPU e la periferica seriale.
Durante la trasmissione di dati dalla CPU alla porta seriale, i valori Byte vengono convertiti in bit seriali, che
vengono quindi riconvertiti in valori Byte durante la ricezione dei dati.
Per completare la trasmissione dei dati, è tuttavia necessario un ulteriore livello di interpretazione. Nel
sistema operativo di Windows viene utilizzato il driver di comunicazione Comm.drv per inviare e ricevere
dati utilizzando le funzioni standard dell'API di Windows. Il produttore della periferica seriale fornisce un
driver specifico per la connessione dell'hardware a Windows. Quando si utilizza il controllo comunicazioni,
vengono eseguite funzioni dell'API che vengono quindi interpretate dal driver Comm.drv e passate al driver
della periferica.
Un programmatore deve occuparsi esclusivamente dell'interazione di Windows. Un programmatore di Visual
Basic deve invece occuparsi dell'interfaccia fornita dal controllo comunicazioni alle funzioni dell'API del
26/02/2007 18.09
Nuova pagina 1
3 of 7
http://ennius.interfree.it/vba/vba89.htm
driver di comunicazione di Windows, ovvero deve impostare ed eseguire il monitoraggio delle proprietà e
degli eventi del controllo comunicazioni.
Connessione seriale
Per utilizzare il controllo comunicazioni è innanzitutto necessario stabilire la connessione alla porta seriale.
Nella tabella seguente sono elencate le proprietà che consentono di stabilire la connessione seriale.
Proprietà
Descrizione
CommPort
Imposta e restituisce il numero della porta di comunicazione.
Settings
Imposta e restituisce in forma di stringa i valori di velocità in baud, parità, bit
di dati e bit di stop.
PortOpen
Imposta e restituisce lo stato di una porta di comunicazioni, oltre ad aprire e a
chiudere la porta.
Apertura di porte seriali
Per aprire una porta seriale, è necessario impostare le proprietà CommPort, PortOpen e Settings. Ad
esempio:
' Apre la porta seriale
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
La proprietà CommPort consente di impostare la porta seriale da aprire. Se un modem è collegato alla porta
COM2, l'esempio precedente imposta il valore su 2 (COM2) ed esegue la connessione al modem. È possibile
impostare il valore della proprietà CommPort su un numero compreso tra 1 e 16 (il valore predefinito è 1).
Se tuttavia si imposta questo valore su una porta COM non disponibile per il sistema in cui l'applicazione
viene eseguita, verrà generato un errore.
La proprietà Settings consente di specificare la velocità in baud, la parità e il numero di bit di dati e bit di
stop. Per impostazione predefinita, la velocità in baud è impostata su 9600. L'impostazione della parità è
relativa alla convalida dei dati. In genere non viene utilizzata ed è pertanto impostata su "N". L'impostazione
dei bit di dati specifica il numero di bit che rappresenta un blocco di dati. Il bit di stop indica quando un
blocco di dati è stato ricevuto.
Dopo aver specificato la porta che si desidera aprire e la modalità di gestione della comunicazione di dati, è
necessario stabilire la connessione impostando la proprietà PortOpen. Si tratta di un valore booleano, ovvero
True o False. Se tuttavia la porta non è attiva, la proprietà CommPort è impostata in modo non corretto
oppure la periferica non supporta le impostazioni specificate, verrà generato un errore oppure la periferica
esterna non funzionerà correttamente. Quando la proprietà PortOpen viene impostata su False la porta viene
chiusa.
Utilizzo di un modem
Nella maggior parte dei casi il controllo comunicazioni viene utilizzato per programmare l'applicazione in
modo che possa essere eseguita insieme a un modem. Il controllo consente di utilizzare il gruppo di comandi
Hayes compatibili standard per comporre un numero telefonico o per connettersi e interagire con un altro
modem.
Dopo aver stabilito la connessione con la porta seriale tramite le proprietà CommPort, Settings e PortOpen, è
necessario attivare il modem impostando la proprietà Output con cui è possibile eseguire i comandi per il
controllo dell'interazione tra due modem. Ad esempio:
26/02/2007 18.09
Nuova pagina 1
4 of 7
http://ennius.interfree.it/vba/vba89.htm
' Attiva il modem e compone un numero telefonico.
MSComm1.Output = "ATDT 555-5555" & vbCr
Nell'esempio precedente il comando "AT" avvia la connessione, "D" compone il numero e "T" specifica la
composizione a toni, anziché quella a impulsi. Quando si invia output a un terminale, è necessario specificare
un carattere di ritorno a capo (vbCr). Questa operazione non è invece necessaria per l'output di matrici di
byte.
Per controllare se il comando viene elaborato in modo corretto, è sufficiente verificare che venga restituito il
codice "OK".
Ulteriori informazioni Per un elenco completo dei comandi Hayes compatibili, vedere la documentazione
del modem.
Impostazione delle proprietà Receive e Transmit Buffer in fase di
progettazione
Quando una porta viene aperta vengono creati buffer di trasmissione e di ricezione. Per la gestione di tali
buffer, sono disponibili alcune proprietà del controllo comunicazioni che è possibile impostare in fase di
progettazione nella finestra Pagine proprietà del controllo.
Impostazione delle proprietà dei buffer in fase di progettazione
Allocazione delle memoria dei buffer
Le proprietà InBufferSize e OutBufferSize consentono di specificare la quantità di memoria allocata ai buffer
di ricezione e trasmissione. Per impostazione predefinita le due proprietà vengono impostate sui valori
indicati nell'illustrazione. Maggiore è il valore, minore è la quantità di memoria disponibile per
l'applicazione. Se le dimensioni del buffer sono troppo piccole, potrebbe verificarsi un overflow del buffer, a
meno che non si utilizzi la sincronizzazione.
Nota Data la quantità di memoria attualmente disponibile nella maggior parte dei PC, l'allocazione di
memoria ai buffer non è un'operazione di fondamentale importanza, in quanto è disponibile un maggior
numero di risorse. In altri termini, l'impostazione di valori del buffer maggiori non ha alcun effetto negativo
sulle prestazioni delle applicazioni.
Proprietà RThreshold e SThreshold
Le proprietà RThreshold e SThreshold consentono di impostare o restituire il numero di caratteri che
dovranno essere ricevuti nel buffer di ricezione e di trasmissione prima che venga generato l'evento
OnComm. L'evento OnComm consente di eseguire il monitoraggio e rispondere alle modifiche dello stato
della comunicazione. Con l'impostazione di entrambe le proprietà su zero (0) è possibile impedire che
l'evento OnComm venga generato, mentre con l'impostazione su un valore diverso da 0, ad esempio 1,
l'evento OnComm viene generato ogni volta che un carattere viene ricevuto in uno dei buffer.
Ulteriori informazioni Per informazioni su queste proprietà, vedere "Evento OnComm e proprietà
CommEvent" più avanti in questa sezione.
Proprietà InputLen e EOFEnable
Se si imposta la proprietà InputLen su 0 il controllo comunicazioni esegue la lettura dell'intero contenuto del
buffer di ricezione quando si utilizza la proprietà Input. Durante la lettura di dati in un computer in cui
l'output è formattato come blocchi di dati di lunghezza fissa, è possibile impostare il valore di questa
proprietà in modo appropriato.
La proprietà EOFEnable consente di segnalare l'individuazione di un carattere di fine del file, o EOF, durante
l'ingresso dei dati. Se la proprietà è impostata su True, l'ingresso dei dati viene interrotto e viene generato
l'evento OnComm per indicare che si è verificata questa condizione.
Ulteriori informazioni Vedere "Gestione dei buffer di ricezione e di trasmissione" e "Evento OnComm e
proprietà CommEvent" più avanti in questa sezione.
26/02/2007 18.09
Nuova pagina 1
5 of 7
http://ennius.interfree.it/vba/vba89.htm
Gestione dei buffer di ricezione e di trasmissione
I buffer di ricezione e di trasmissione vengono creati in corrispondenza dell'apertura di una porta e utilizzati
per la memorizzazione dei dati in arrivo e per la trasmissione dei dati in uscita. Il controllo comunicazioni
consente di gestire questi buffer tramite alcune proprietà per l'inserimento e il recupero di dati, per la
restituzione delle dimensioni di ciascun buffer e per la gestione sia di testo che di dati binari. Quando si
utilizza il controllo comunicazioni, è estremamente importante gestire questi buffer in modo corretto.
Buffer di ricezione
La proprietà Input consente di memorizzare e recuperare dati dal buffer di ricezione. Se, ad esempio, si
desidera recuperare dati dal buffer di ricezione per visualizzarli in una casella di testo, è possibile utilizzare il
codice seguente:
TxtDisplay.Text = MSComm1.Input
Per recuperare l'intero contenuto del buffer di ricezione, è innanzitutto necessario impostare la proprietà
InputLen su 0 in fase di progettazione o di esecuzione.
È inoltre possibile ricevere dati in arrivo come testo o come dati binari impostando la proprietà InputMode
sulle costanti Visual Basic comInputModeText o comInputModeBinary. I dati verranno in tal modo
recuperati in forma di stringa o di dati binari in una matrice Byte. È necessario impostare la proprietà su
comInputModeText per i dati che utilizzano il set di caratteri ANSI e la costante comInputModeBinary per
tutti gli altri dati, ad esempio i dati che includono caratteri di controllo incorporati, valori Null e così via.
Ciascun byte di dati ricevuto viene inserito nel buffer di ricezione e il valore della proprietà InBufferCount
viene incrementata di una unità. Tale valore può quindi essere utilizzato per recuperare il numero di byte del
buffer di ricezione. È inoltre possibile impostare la proprietà su 0 per svuotare il buffer di ricezione.
Buffer di trasmissione
La proprietà Output consente di inviare comandi e dati al buffer di trasmissione.
In modo analogo alla proprietà Input, è possibile trasmettere i dati in forma di testo o di dati binari. Con la
proprietà Output è tuttavia necessario trasmettere testo o dati binari specificando una matrice String o Byte.
La proprietà Output consente di inviare comandi, stringhe di testo o dati di matrice Byte. Ad esempio:
' Invia un comando AT
MSComm1.Output = "ATDT 555-5555"
' Invia una stringa di testo
MsComm1.Output = " Questa è una stringa di testo"
' Invia dati di matrice Byte
MSComm1.Output = Out
Le righe di trasmissione devono terminare con un carattere di ritorno a capo (vbCr). Nell'esempio precedente
Out è una variabile definita come matrice Byte, ovvero Dim Out() As Byte. Se fosse un valore Variant di
tipo String, sarebbe definito come Dim Out() As String.
È possibile controllare il numero di byte del buffer di trasmissione tramite la proprietà OutBufferCount e
svuotare il buffer impostando questa proprietà su 0.
Sincronizzazione
Una parte integrante della procedura di gestione dei buffer di ricezione e di trasmissione consiste
nell'assicurare che la trasmissione dei dati venga eseguita correttamente in entrambe le direzioni, ad esempio
che la velocità di ricezione dei dati non superi i limiti del buffer.
Con il termine sincronizzazione viene fatto riferimento al protocollo di comunicazione interno in base a cui i
dati vengono trasferiti dalla porta hardware al buffer di ricezione. Quando la porta seriale riceve un carattere
sotto forma di dati, la periferica di comunicazione deve trasferirlo nel buffer di ricezione in modo che possa
essere letto dal programma. Un protocollo di sincronizzazione assicura che non si verifichi alcuna perdita di
dati dovuta a un overrun del buffer. Questa situazione si verifica quando i dati raggiungono la porta ad una
26/02/2007 18.09
Nuova pagina 1
6 of 7
http://ennius.interfree.it/vba/vba89.htm
velocità troppo elevata che ne impedisce il trasferimento nel buffer di ricezione.
Per specificare il protocollo di sincronizzazione da utilizzare nell'applicazione, è necessario impostare la
proprietà Handshaking. Per impostazione predefinita, questo valore viene impostato su comNone, ovvero
nessun protocollo. Le possibili impostazioni sono le seguenti:
Impostazione
Valore
Descrizione
comNone
0
Nessuna sincronizzazione (impostazione
predefinita).
comXOnXOff
1
Sincronizzazione XOn/XOff.
comRTS
2
Sincronizzazione RTS/CTS (Request To
Send/Clear To Send).
comRTSXOnXOff
3
Sia Request To Send che XON/XOFF.
La scelta del protocollo si basa sulla periferica a cui ci si connette. Con l'impostazione comRTSXOnXOff è
supportato sia il protocollo Request To Send che il protocollo XON/XOFF.
In molti casi, la sincronizzazione viene gestita dal protocollo stesso. Di conseguenza, l'impostazione della
proprietà su un valore diverso da comNone può generare conflitti.
Nota Se si imposta la proprietà su comRTS o comRTSXOnXOff, è necessario impostare la proprietà
RTSEnabled su True. In caso contrario, sarà possibile connettersi e inviare dati, ma non ricevere dati..
Evento OnComm e proprietà CommEvent
A seconda dell'area di validità e della funzionalità dell'applicazione, potrebbe essere necessario controllare e
rispondere a un certo numero di eventi o errori generati durante la connessione a un'altra periferica oppure
durante la ricezione o la trasmissione dei dati.
L'evento OnComm e la proprietà CommEvent consentono di intercettare e verificare il valore degli eventi e
degli errori di comunicazione.
In corrispondenza di un evento o di un errore di comunicazione, viene generato l'evento OnComm e il valore
della proprietà CommEvent viene modificato. Se necessario, è pertanto possibile verificare il valore della
proprietà CommEvent ogni volta che l'evento OnComm viene generato. Dato che la qualità della
comunicazione è imprevedibile, soprattutto nel caso di comunicazioni telefoniche, l'intercettazione di questi
eventi ed errori consente di fornirvi una risposta adeguata.
Nella tabella seguente sono elencati gli eventi di comunicazione che generano l'evento OnComm. I valori
vengono quindi scritti nella proprietà CommEvent.
Costante
Valore
Descrizione
comEvSend
1
Il numero di caratteri del buffer di trasmissione è inferiore al
valore di SThreshold.
comEvReceive
2
Numero di caratteri RThreshold ricevuti. Questo evento
viene generato continuamente fino a quando i dati non
vengono rimossi dal buffer di ricezione tramite
l'impostazione della proprietà Input.
26/02/2007 18.09
Nuova pagina 1
7 of 7
http://ennius.interfree.it/vba/vba89.htm
comEvCTS
3
Modifica della linea CTS (Clear To Send).
comEvDSR
4
Modifica della linea DSR (Data Set Ready). Questo evento
viene generato solo con la modifica di DSR da 1 a 0.
comEvCD
5
Modifica della linea CD (Carrier Detect).
comEvRing
6
Individuato squillo. Alcuni trasmettitori-ricevitori asincroni
universali o UART (Universal Asynchronous
Receiver-Transmitter) potrebbero non supportare questo
evento.
comEvEOF
7
Ricezione di un carattere di fine del file, o EOF (carattere
ASCII 26).
L'evento OnComm viene inoltre generato quando vengono individuati gli errori indicati di seguito, con la
conseguente scrittura di un valore nella proprietà CommEvent.
Impostazione
Valore
Descrizione
comEventBreak
1001
Ricezione di un segnale di interruzione.
comEventFrame
1004
Errore di frame. L'hardware ha individuato un errore di
frame.
comEventOverrun
1006
Overrun della porta. L'hardware non ha letto un carattere
prima dell'arrivo del successivo e il carattere è andato
perduto.
comEventRxOver
1008
Overflow del buffer di ricezione. Spazio esaurito nel
buffer di ricezione.
comEventRxParity
1009
Errore di parità. È stato rilevato un errore di parità.
comEventTxFull
1010
Buffer di trasmissione pieno. Spazio esaurito nel buffer di
trasmissione durante il tentativo di inserimento di un
carattere.
comEventDCB
1011
Errore imprevisto durante il recupero di DCB (Device
Control Block) per la porta.
prelevato sul sito http://ennius.interfree.it
26/02/2007 18.09