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:

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 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:

' 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.

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 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.

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