Comunica tra AVR e PC utilizzando la porta seriale virtuale

Olga Weis

Questo articolo parlerà di come comunicare tra AVR e PC in un modo semplice ma abbastanza completo. È semplice perché utilizzerò un'interfaccia piuttosto "classica" per comunicare tra AVR e PC, l'interfaccia RS232 tramite le porte COM. Completo come ti guiderò nella transizione tra AVR e PC, come scrivere l'interfaccia del programma RS232 sul computer e sull'AVR. Nello specifico questo articolo include:

Contenuto


  1. Schema e funzione dei pin della porta COM sul computer. Circuito AVR su PC tramite porta COM.
  2. Creare una porta COM virtuale sul PC per scopi di simulazione.
  3. Utilizzare le funzioni nella libreria di esportazione standard C come printf, scanf ... in WinAVR.
  4. Scrivi il programma della porta COM sul PC (Visual C ++, Visual Basic)

1. Panoramica della porta COM


Una porta COM o Serial Port è una porta di comunicazione che fa parte del "vecchio" modulo del PC, sia desktop che laptop. Oggi, con l'emergenza e "l'espansione" dello standard USB, la porta COM (e la porta LPT o la porta parallela) sta scomparendo. Trova maggiori informazioni su cosa è la porta seriale e come funziona nel nostro nuovo articolo.

La comunicazione della porta COM è RS232 comunicazione seriale Questo standard è piuttosto lento rispetto all'USB. Tuttavia, con la robotica o il controllo, il COM-RS232 è molto popolare per la sua semplicità e anche per ... questo rallentamento. Le porte COM sui computer esistenti (ove disponibili) sono per la maggior parte maschi a 9 pin. Tuttavia, da qualche parte c'è una porta COM a 25 pin, che è più o meno la stessa della porta LPT, ma è un maschio, mentre la porta LPT è femmina.

Bisogno di capire punti principali su null modem e pinout RS 232.

La Figura 1 mostra due tipi di porte COM e la Tabella 1 riassume le funzioni delle porte.

Porta COM a 9 pin e porta COM a 25 pin
Figura 1.

pin sulla porta COM
Tabella 1

Più notevole nel pin della porta COM è il pin a 3 pin 0V SG (terra del segnale), i pin del trasmettitore dati TxD e i pin di ricezione dati RxD. Questi sono tre pin di base per la comunicazione RS232 e UART compatibile su AVR. I pin rimanenti possono essere utilizzati anche se l'utente ha una certa conoscenza dell'organizzazione dei registri del PC. Nella maggior parte dei casi, tuttavia, vengono utilizzati solo tre pin.

Come indicato in AVR5-UART, gli standard RS232 e UART sono generalmente gli stessi in termini di trasmissione, velocità di trasmissione ... ma variano in tensione e polarità. Fare riferimento all'esempio di confronto in Figura 2.

Confronta UART e RS232
Figura 2.

Nello standard UART (su AVR), il livello 1 corrisponde all'alta tensione (5V, TTL) mentre per RS232 il livello 1 corrisponde alla bassa tensione (tensione negativa, forse -12V). Chiaramente c'è bisogno di un "convertitore" tra i due.

Fortunatamente, non abbiamo bisogno di progettare questo ponte da soli perché ci sono circuiti integrati dedicati. MAX232 è uno degli IC di switch UART-RS232 più utilizzati. Naturalmente, è possibile creare un circuito semplice con pochi componenti come condensatori, resistori, diodi e transistor, ma la stabilità non è garantita.

La Figura 3 mostra come utilizzare l'IC Max232 per la connessione tra UART su AVR e la porta COM del PC.

Connetti l'AVR al PC tramite Max232
Figure 3.

Il circuito di cui sopra ha solo l'effetto di variare il livello di tensione tra RS232 e UART. Non cambia la modalità di comunicazione di questi standard e quindi la programmazione su PC e AVR non è un sostituto, un cambiamento. In effetti, Max232 ha due traverse.

Nella figura 3, utilizziamo solo il transceiver 1. Il pin TxD (pin 3) della porta COM collegata a R1IN (ingresso 1 di ricezione) di Max232 corrisponde all'R1OUT (ricezione) 1 uscita) deve essere collegato al ricevitore RX di l'AVR. Lo stesso per T1IN e T1OUT. Il valore dei condensatori 10uF è relativamente standard, ma quando si sostituisce il condensatore con 1uF, il circuito rimane attivo ma la distanza di trasmissione (connettore cabina) sarà più breve (se troppo a lungo genererà un errore di comunicazione). I resistori in Figura 3 funzionano solo per proteggere le porte COM e gli IC, quindi potrebbe non essere necessario utilizzare questi resistori senza influire sul funzionamento del circuito. Vcc e GND sono fonti di circuiti AVR.

Nota: Se si desidera comunicare tra due computer tramite la porta COM, è necessario utilizzare 1 cavo crossover (I pin TxD di PCx collegati a RxD di PC2 e viceversa) per collegare 2 porte COM insieme.

2. Crea una porta COM virtuale per la simulazione


Per rendere la comunicazione tra AVR e PC tramite porta COM è ovviamente necessaria una porta COM, inoltre è necessario creare un circuito AVR e collegare il Max232. Sfortunatamente, non tutti i computer hanno questa porta. Se vuoi solo imparare come comunicare con AVR-PC o semplicemente vuoi testare un particolare algoritmo, forse è preferibile simulare la soluzione. Allo scopo di simulare la comunicazione RS232, Proteus è di nuovo utile per simulare le trasmissioni di dati con porte COM.

Quindi il problema è come creare porte COM virtuali sul computer e collegarle insieme per eseguire simulazioni di comunicazione. A causa della natura della porta COM è solo "aperto" (aperto) solo una volta, il che significa che i due software non possono aprire la stessa porta.

La nostra idea è di creare due porte COM virtuali che siano "incrociate" insieme (es. COM2 e COM3). Nell'output di Proteus dell'UART è collegato a COM2. Nel software PC (ad esempio, HyperTerminal) ci colleghiamo a COM3. In questo modo siamo stati in grado di comunicare tra l'AVR (modello Proteus) e il PC (software HyperTerminal).

Ci sono alcuni buoni software che possono creare porte COM virtuali e connessioni virtuali tra loro esattamente come richiesto da noi. In questa sezione presenterò un software Eltima (Virtual Serial Port Driver).

Virtual Serial Port Drive (VSPD) emula le porte seriali virtuali e le collega in coppia tramite cavo virtuale null modem. Le applicazioni su entrambe le estremità della coppia saranno in grado di scambiare dati in modo tale che tutto ciò che è scritto sulla prima porta apparirà nella seconda e all'indietro.

VSPD è facile da usare e stabile. Dopo scaricamento procedere con l'installazione, trovare ed eseguire il file "Aggiungi coppia".

Interfaccia di VSPD come mostrato in Figura 4.

Virtual Serial Port interfaccia software
Figura 4.

Nella scheda "Manager ports", il software suggerisce automaticamente che è possibile creare un paio di porte COM virtuali, selezionarle nuovamente e fare clic su "Aggiungi coppia" per creare queste due porte COM. La porta COM virtuale creata da VSPD viene visualizzata nell'elenco "Elenco dispositivi" di Windows e non viene persa quando l'utente spegne il software VSPD. Esegui Gestione periferiche di Windows. Nella sezione Porte (COM e LPT) vedrai le porte COM virtuali create (vedi esempio in Figura 5).

Porte COM virtuali e connessioni tra di loro create da VSPD
Figura 5.

3. Utilizzare la libreria di esportazione standard stdio.h in WinAVR


Chiunque abbia mai imparato il linguaggio di programmazione C non dimenticherà il suo primo programma "ciao mondo":

Ciao mondo

Questo programma fa semplicemente il lavoro di digitare "ciao, mondo" sullo schermo. La stampa delle lettere è fatta dal "printf" comando nella riga 3. Il printf comando è nel stdio libreria chiamata la libreria standard di input / output. Il comando printf in stdio non è solo per la stampa sullo schermo, ma può stampare su qualsiasi dispositivo di output, anche stampare un file su un disco rigido del computer ...

Per AVR, se si utilizza il compilatore Quando si chiama printf, la stringa viene stampata (output) sul modulo UART (ovviamente è necessario installare i registri UART per attivare prima l'UART).

CodevisionAVR stesso comprende UART come dispositivo di input / output predefinito per i comandi nella libreria stdio (printf, scanf ...). Tuttavia, con WinAVR (avr-gcc) tutto il resto è diverso. Per utilizzare input e output standard, è necessario dichiarare un dispositivo di input e una funzione di input "di base". La funzione di base è una funzione definita dall'utente, il cui compito è quello di esportare (o importare) un carattere in un dispositivo di input.

Ad esempio, in AVR5 - comunicazione UART definiamo una funzione "uart_char_tx" caratteri di uscita a UART come segue:

uart_char_tx

Oppure in TextLCD guardiamo la funzione "putChar_LCD" per emettere un carattere sul display LCD come di seguito:

putChar_LCD

Tutti e due "uart_char_tx" e "putChar_LCD" come l'esempio sopra può essere usato come una funzione di importazione "di base" per funzioni come printf ... in standard sdtio librerie di esportazione. Supponendo la funzione "uart_char_tx" viene utilizzato, quando si chiama il printf funzione, la stringa viene esportata nell'UART.

Al contrario, se il "putChar_LCD" la funzione è usata come funzione di base, il stdio printf la funzione farà uscire la stringa di dati sul display LCD. Con questo metodo, il traduttore di avr-gcc ci consente di accedere alla libreria stdio in modo più flessibile, è possibile utilizzare le funzioni di stdio per esportare / importare dati su qualsiasi dispositivo come terminale UART, TextLCD, LCD grafico o persino SD, MMC card ... una volta si definisce la funzione di input "base".

Per illustrare come utilizzare le funzioni nella libreria stdio, mostrerò un esempio di immissione dei dati in LCD testo e in uart utilizzando stdio's printf .... La simulazione del circuito per questo esempio è mostrata nella Figura 6 di seguito.

Simula esempio di output di esempio con la libreria stdio
Figura 6.

Tutti i dati visualizzati sul display LCD e il terminale uart nella Figura 6 vengono eseguiti tramite printf e fprintf funzioni. Anche in questo esempio, l'utente può inserire un carattere dalla tastiera e il Codice ASCII. della chiave verrà stampato sul terminale. Il codice mostrato in List1.

Esportare i dati su LCD e UART con la libreria di esportazione standard di stdio
Elenco 1.

Per utilizzare le funzioni nella libreria di output standard, è necessario includere il file di intestazione della libreria come nella riga 4 "#include ".

Nota che quando si usano le funzioni avr-gcc, avr -libc si trovano nella sottodirectory"/avr/"della directory include.

Per esempio, l'intestazione io.h o interrupt.h contiene funzioni speciali per avr, quando si allegano questi file si specifica qualcosa come: "#include " ... Tuttavia, il linguaggio C standard (come stdio.h, math.h, ...) si trova direttamente nella directory include, quando il collegamento di questi file deve essere scritto direttamente come nella riga di codice 4. Anche perché questo esempio utilizza LCD, è necessario copiare e includere la libreria myLCD.h come nella riga 5 (recensione TextLCD).

Come discusso sopra, per utilizzare le funzioni in stdio abbiamo bisogno di funzioni di input / output di base. Le righe da 7 a 11 sono le funzioni di output uart denominate "uart_char_tx", che verrà utilizzato come funzione di base per le funzioni di output di stdio. La "uart_char_tx" funzione è stata discussa nella lezione UART, dove è stata apportata una piccola modifica alla linea 8 "Se (chr == '\ n') uart_char_tx ('\ r')", questa linea ha il significato che quando l'utente vuole emettere il personaggio "\ n", la funzione " uart_char_tx " emetterà il carattere '\ r'.

Quindi se vi capita di incontrare un '\ n' (con codice ASCII 10, chiamato Svanzamento Riga - LF) alla fine della frase, una combinazione di '\ r' + '\ n' (codice '\ r' = 13 chiamato ritorno a capo - CR) sarà inviato al flusso. Per comprendere meglio questo problema, imparerai di più sul Feed di ritorno a capo del carrello (CRLF) in Windows.

Due righe di codice 13 e 14 sono molto importanti quando si utilizza la libreria stdio. Il significato di queste due linee è quello di creare due "FILE" virtuale (noto anche come flusso) per l'esportazione dei dati. Esaminiamo la riga 14: crea un flusso per la UART.

static FILE uartstd = FDEV_SETUP_STREAM (uart_char_tx, NULL, _FDEV_SETUP_WRITE);

Creiamo una variabile chiamata uartstd (user-named self-named) che è di tipo FILE (un tipo di dispositivo virtuale), quindi utilizza la macro "FDEV_SETUP_STREAM" per inizializzare e impostare i parametri per uartstd. Questa macro ha la funzione di aprire un fdevopen e assegnare "strumenti" per l'importazione nel dispositivo.

#define FDEV_SETUP_STREAM (metti, prendi, rwflag)

Il parametro allegato "FDEV_SETUP_STREAM" consiste in una funzione di base chiamata "mettere", una funzione di base chiamata "ottenere" e una bandiera che indica la funzione di output o di input del dispositivo che si sta aprendo. In particolare, nella riga 13, la variabile uartstd è un "dispositivo virtuale" utilizzato per l'output di dati (a causa della _FDEV_SETUP_WRITE parametro).

Lo strumento per l'output di uartstd è il "uart_char_tx" funzione che abbiamo creato sopra. Non c'è alcuna funzione per ottenere dati da uartstd (ottenere = Parametro NULL). Potete immaginare questo: la variabile uartstd è un foglio di carta, la funzione "uart_char_tx" è un "timbro" che consente di stampare un carattere su un foglio di uartstdpaper. Noi assegniamo "uart_char_tx" a usrtstd quindi tutte le stampe su carta uartstd saranno fatte da "uart_char_tx". La funzione "uart_char_tx" è quindi chiamata la funzione base.

Allo stesso modo, nella riga 13 creiamo un'altra "carta" chiamata lcdstd e la sua funzione di base lascia la funzione "putChar_LCD", che è già definito nel myLCD.h biblioteca.

Le righe nel programma principale dalle righe 17 e 25 avviano UART e TextLCD, puoi rivedere gli articoli correlati per comprenderne di più. Dopo l'avvio, UART e LCD sono pronti per l'esportazione dei dati. Ora possiamo usare le funzioni nella libreria stdio come printf o sprint ... per esportare i dati. Vedrai la Figura 6 perché la userò per confrontarla con le seguenti linee di codice. Linea 27 "printf (" In lan 1 "), lo scopo è di stampare la stringa "In lan 1" sul display LCD usando la funzione printf. Tuttavia, come mostrato in Figura 6, non vedi questa stringa apparire.

Ora guarda la riga 28 "fprintf (& lcdstd,"www.eltima.com")" e guarda ancora la Figura 6, questa volta hai visto la stringa "www.eltima.com" appare sullo schermo LCD, riuscito con la funzione fprintf. La fprintf funzione è una funzione che invia i dati a un dispositivo virtuale, in cui il primo parametro della funzione punta al dispositivo e il secondo parametro è la stringa di dati da stampare. In questo caso, abbiamo usato fprintf per esportare il file "www.eltima.com" stringa al lcdstd macchina virtuale e riuscita. Che dire della funzione printf nella riga 27? Diamo un'occhiata alle righe da 30 a 32. Linea 30 usiamo ancora una volta la funzione printf "printf (" In lan 3 ")" per stampare il "lan 3" sul display LCD ma non ha avuto esito positivo (vedere LCD in Figura 6). Nella riga 31 assegniamo "stdout = & lcdstd" dove stdout è una variabile (in realtà un flusso o un dispositivo virtuale) del linguaggio C, che definisce il dispositivo predefinito per l'immissione dei dati. Assegnando stdout a lcdstd come linea 31, dichiariamo che LCD è il dispositivo di input predefinito. Quindi, nella linea 32 chiamiamo printf "printf (" Lan lan 4:% i ", x)" abbiamo avuto successo.

Questa volta, guarda sul display LCD vedrai la riga "Lan Lan 4: 8205". Qui 8205 è il valore della variabile x nell'istruzione alla riga 32. In sintesi, la fprintf la funzione consente la stampa diretta su un dispositivo virtuale specificato durante l'utilizzo di printf abbiamo bisogno di assegnare il dispositivo di input Precedine per la variabile stdout. Dai un'occhiata al codice dalle righe da 34 a 37 e le prime tre linee nel terminale in Figura 6, che probabilmente già conosci da solo.

Infine, il server di interrupt dati UART si trova nelle righe di codice da 41 a 44. In questo esempio, eseguiamo semplicemente " Ma ASCII: " linea con il valore ricevuto da "L'UART è contenuto nel registro UDR: "fprintf (& uartstd," Ma ASCII:% i \ n ", UDR)".

Per comprendere appieno la stdio libreria in WinAVR è necessario leggere la documentazione "avr-libc Manual", la sezione delle strutture IO standard.

4. Programmazione con porta COM utilizzando Visual Basic e Visual C ++


In molti casi, i requisiti di comunicazione richiedono un livello più elevato di complessità, come la memorizzazione dei dati o la rappresentazione grafica variabile, quindi gli utenti devono scrivere autonomamente i propri programmi. Questo tutorial mostra come scrivere programmi su un computer per trasmettere e ricevere dati da una porta COM in Visual Basic e Visual C ++ 6.0. Nota, lo scopo di questo articolo è su AVR, quindi l'applicazione scritta su Windows I ha appena presentato un modo semplice per coglierne il principio. Per sviluppare applicazioni più sofisticate, i lettori devono dotarsi della conoscenza della programmazione Windows. In tutte le esercitazioni seguenti presumo che i lettori meno esperti sappiano come creare un progetto in Visual Basic o / e Visual C ++.

1. Scrivere un programma di porta COM utilizzando Visual Basic 6.0


Dalle versioni successive di Windows 2000, la comunicazione con le porte del computer tradizionali, come le porte LPT, in Windows era relativamente difficile. Tuttavia, con le porte COM, è una fortuna che Microsoft fornisca uno strumento (in realtà un controllo) chiamato "Microsoft Communication Control" o MSComm in breve. MSComm è apparso nel popolare software di programmazione MS come Visual Basic o Visual C ++ come "controllo". Come "controller" progettato per porte COM, MSComm contiene tutti gli strumenti necessari per comunicare con questa porta, il compito del programmatore è semplicemente quello di dichiararlo e usarlo. Per illustrare come utilizzare MSComm in Visual Basic, seguire le istruzioni riportate di seguito.

Esegui Visual Basic 6, vai al menu "File / Nuovo progetto" e crea un "EXE standard". Verrà visualizzato un progetto denominato "Progetto1" con una finestra di dialogo in background denominata Form1. Puoi nominare qualsiasi progetto e modulo principale. Dalla barra degli strumenti Casella degli strumenti, fare clic sul controllo "casella di testo" e disegnare due caselle di testo principali chiamate txtOuput e txtInput (rinominare le caselle di testo nella finestra Proprietà. in basso a destra, a destra). Con txtOutput, impostare il parametro Multiple su True e ScrollBars su "3 - Both"

Quindi metti il controllo MSComm nella forma principale. Per impostazione predefinita, il controllo MSComm non è disponibile in Visual Basic Toolbox, è necessario aggiungerlo alla Toolbox prima di utilizzarlo. Per aggiungere MSComm alla casella degli strumenti, selezionare il menu "Progetto / componenti". Verrà visualizzata una finestra di dialogo denominata Componenti. Trova e fai clic su "Microsoft Comm Control 6.0" come mostrato nell'immagine e fai clic su OK. Ora, nella casella degli strumenti di VB vedrai apparire l'icona di MSComm. Fare clic su questa icona e disegnare un oggetto MSComm nel modulo principale. Mantenere il nome predefinito di questo oggetto è MSComm1.

Scrivi un codice:

Lo scopo di questo esempio è il seguente: I dati ricevuti dalla porta COM vengono visualizzati sul txtOutput casella di testo e quando l'utente digita 1 carattere nel file txtInput carattere verrà trasmesso tramite la porta COM.

Per prima cosa, fai doppio clic sul modulo principale, scrivi il seguente codice nel file Form_Load () event:

Form_Load

Lo scopo di questo codice è impostare i parametri per MSComm1.

  • CommPort parameter = 3 significa che vogliamo connetterci alla porta COM3. Questo parametro varia in base alla porta COM con cui vogliamo comunicare.

    Parametro Setting = "38400, N, 8.1" significa baud rate = 38400, nessun bit di parità, la lunghezza del frame è 8 e 1 bit di stop.

  • RThreshold = 1 significa che quando c'è un carattere nella porta COM, si verificherà un interrupt di ricezione dati.
  • InputLen = 1 significa che durante la lettura dei dati dal buffer di ricezione, leggeremo un carattere (1 byte).
  • PortOpen = True consentendo alle porte COM "aperte" di essere pronte per comunicare.


  • Successivamente, fai doppio clic sull'icona MSComm1 nel modulo principale per scrivere il codice nel file MSComm1_onComm () evento:
MSComm1

L'evento onComm() è essenzialmente un MSComm gestore di interrupt. Quando c'è un byte di dati inviati al buffer della porta COM (il numero di byte specificato da RThreshold), il onComm si verificherà un evento, in questo caso scriveremo il codice per ricevere ed elaborare i dati. se. Nella riga 2 dichiariamo una variabile temporanea denominata TestoInput con tipo di dati stringa. Si noti che l'evento onComm può verificarsi per una serie di motivi, in cui ci interessa solo il caso dei dati in arrivo, la linea 3 è una sorta di evento "filtro", eseguiamo solo la riga di codice mentre si verifica l'evento comEvReceive (i dati viene recuperato):

Se Me.MSComm1.CommEvent = comEvReceive Poi. L'unica cosa importante da leggere sui dati inviati a COM è leggere il buffer di input di MSComm come nella riga 4:InputText = MSComm1.Input. Dopo questo comando i dati saranno contenuti nella variabile temporanea InputText. Successivamente, incrementiamo i caratteri ricevuti nel contenuto della casella di testo txtOutput da visualizzare sullo schermo (riga 5): txtOutput.Text = txtOutput.Text + InputText. La linea 6 è responsabile di portare il cursore alla fine del contenuto di txtOutput per una facile visualizzazione dei dati.

comEvReceive

Infine, fai doppio clic sul testo nella casella di testo di input e cerca l'evento KeyPress per scrivere le seguenti righe di codice:

L'evento txtInput_KeyPress si verifica quando un utente preme un tasto txtInput. La linea Me.MSComm1.Output = Chr (KeyAscii) esegue l'invio del valore di KeyAscii alla porta COM, dove KeyAscii è il ASCII codice del tasto premuto.

Hai finito di scrivere la porta COM tramite Visual Basic. Per testare il programma, eseguire la seguente simulazione:

  • Utilizzare il software VSPD per creare due porte COM virtuali COM2 e COM3, incrociandole tra loro (vedere la sezione della porta COM). virtuale).
  • Guarda nella cartella contenente il AVR_STD esempio ed eseguire il file di simulazione usando Proteus AVR_STD_Terminal.DSN software.
  • Torna a Visual Basic, fare clic sul pulsante Esegui o F5 per eseguire il nuovo progetto.
  • Fare clic su Esegui in Proteus per simulare il circuito AVR_STD_Terminal.DSN. Vedrai apparire del testo txtOutput. Clic txtInput e digitare qualsiasi tasto per vedere il risultato. Quindi hai scritto te stesso con successo un'applicazione COM con porta COM in Visual Basic.

2. Scrivere un programma di porta COM utilizzando Visual C ++ 6.0


Questa parte del tutorial esamina come utilizzare una porta COM come nell'esempio sopra ma utilizza Microsoft Visual C ++ (VC ++). Lo scopo principale è di guidare come utilizzare MSComm in VC ++, quindi presenterò parti molto imprecise come la creazione di un progetto in VC ++. I lettori devono dotarsi di maggiori conoscenze sulla programmazione VC ++. Uno dei migliori tutorial per principianti è "Teach Yourself Visual C ++ 6 in 21 Days" di Sams Teach Yourself, che puoi leggere se necessario.

Da VC ++ vai al menu "File / Nuovo" per creare un nuovo progetto. Seleziona il tipo di progetto come "MFC AppWizard (exe)", nel nome della casella Nome progetto il progetto è AVR_PC, fare clic su OK. Nella seconda finestra di dialogo selezionare "Finestra di dialogo basata" per il tipo di progetto, quindi fare clic su Fine per creare il progetto (altri passaggi predefiniti).

Quando viene creato il nuovo progetto, viene visualizzata una finestra di dialogo con i pulsanti "OK" e "Annulla". Usa lo strumento "Modifica" per aggiungere 2 "Modifica caselle" e riorganizzare l'interfaccia. Fare clic con il tasto destro sulla casella Modifica e selezionare Proterties dal Popup_menu, a sua volta modificare l'ID delle 2 caselle di modifica in IDC_OUTPUT e IDC_INPUT.

Entra VB, Control MSComm non appare di default nel VC ++ Toolbox, che dobbiamo aggiungere quando vogliamo usare questo controllo. Vai al menu "Progetto / Aggiungi al progetto / Componenti e controlli ...". Quando viene visualizzata la finestra di dialogo "Componenti e Control Gallery", selezionare la cartella "Controled ActiveX registrati" e accedere al file "Microsoft Communications Control, Versione 6.0" e fare clic sul pulsante di inserimento, quindi fare clic su OK quando vengono poste domande. Fare clic sul pulsante Chiudi per chiudere la finestra di dialogo. A questo punto, l'icona di MSComm apparirà nel VC ++ Toolbox. Fare clic sull'icona di MSComm e disegnare un controllo sulla finestra di dialogo principale del progetto. Per impostazione predefinita, questo controllo è denominato IDC_MSCOMM1.

La programmazione in VC ++ è più difficile di VB (per i principianti). Le proprietà dei controlli come la casella Modifica non sono direttamente accessibili come Casella di testo in VB. Ad esempio, per assegnare e visualizzare una stringa o un numero nella casella Modifica, è necessario eseguire l'assegnazione e l'aggiornamento dei dati tramite variabili intermedie. In questo passaggio creiamo due variabili per le 2 caselle di modifica.

Clicca il "Vista / ClassWizard" menu o il "Ctrl + W" combinazione chiave, nel "MFC ClasWizard" finestra di dialogo, selezionare la scheda "Variabili membro". Fai clic sulla linea IDC_OUTPUT, clic il "Aggiungi variabile ..." pulsante e inserire il nome della variabile "m_txtOutput" con il tipo è CString.

Ripetere i passaggi precedenti per creare una variabile denominata "m_txtInput" per "IDC_INPUT". Infine, crea una variabile chiamata "m_comm" per IDC MSCOMM1. Fare clic su OK per chiudere la finestra di dialogo Creazione guidata classe MFC. D'ora in poi, dobbiamo solo ricordare le 3 variabili "m_txtOutput", "m_txtInput", "m_comm" quando vogliamo accedere alle caselle Modifica e MSComm mentre scriviamo il codice.

Scrivi un codice:

Premi Ctrl + W per riaprire ClassWizard, questa volta scegli il "Mappe dei messaggi" scheda, nel "Nome della classe" la scatola lo assicura "CAVR_PCDlg" è selezionato. In ID oggetto, selezionare "CAVR_PCDlg" Messaggi" trova e seleziona "WM_INITDIALOGS" quindi fare clic "Modifica codice".

Ora puoi scrivere il codice per il "OnInitDilaog ()" evento, che è un evento che si verifica quando si esegue il programma e viene avviata la finestra di dialogo principale. Quindi imposteremo i parametri per m_comm qui (m_comm è il nome della variabile che rappresenta il IDC_MSCOMM1 controllo che abbiamo creato nei passaggi precedenti). Aggiungere le seguenti righe dopo il "// TODO: Aggiungi inizializzazione aggiuntiva qui " linea:

Queste cinque righe di codice corrispondono alle cinque righe nella sezione Form_Load () di il progetto VB che abbiamo trattato in precedenza, quindi non ho bisogno di elaborare queste righe di codice.

Form_Load

Quindi scriveremo il codice per l'evento onComm del controllo MSComm, prima di scrivere il codice premere Ctrl + W per visualizzare la finestra di dialogo ClassWizard ed eseguire i sei passaggi per aggiungere l'evento onComm al progetto.

Scrivi il codice sa nel onComm evento:

onComm

Come accennato in precedenza, m_comm è una variabile che rappresenta MSComm. La gestione delle porte COM viene ora eseguita tramite la variabile m_comm. Nella riga 4 dichiariamo uno strInput sub-variabile del tipo CString che contiene il valore di quest'ultimo. Proprio come in VB, l'evento onComm può accadere per molte ragioni.

Ci interessa solo il caso in cui ci sono dati da buffer, la riga 5 consente di filtrare l'evento: se (m_comm. GetCommEvent () == 2). Linea 6 dichiariamo una sotto variabile chiamata in_dat con il COleVariant tipo . COleVariant è la classe di MFC, il suo nome è una combinazione di C + OLE + VARIANT in cui OLE è "Collegamento oggetto incorporato""È un tipo di oggetto che non è disponibile" incorporato, MSComm è un tipo OLE.

VARIANTE è un tipo di variabile sconosciuto. Quando hai un x ​​variabile, a volte vuoi assegnare un valore numerico a x, ma a volte si desidera assegnare una stringa a x. Quindi dichiarare x è VARIANTE. Nel caso di MSComm, i dati di input e output di questo oggetto sono "sconosciuto" o "VARIANT".

Nella riga 7 otteniamo semplicemente il valore da m_comm sulla variabile in_dat: in_dat = m_comm.GetInput(). La prossima linea "estraiamo" l'elemento stringa dalla variabile in_dat e assegnagli la variabile strInput: strInput = in_dat.bstrVal (in modo relativo, puoi cambiare in_dat in CString e assegnarlo a strInput).

Dobbiamo estrarre CString perché la casella di modifica mostra solo CString. Per visualizzare i dati ricevuti nella casella Modifica ( IDC_OUTPUT ) abbiamo incrementato la variabile m_txtOutput (rappresentato dalla casella Modifica IDC_OUTPUT ) con la riga 9: m_txtOutput + = strInput. Infine, in ordine per il valore del m_txtOutput variabile da aggiornare alla casella Modifica, dobbiamo chiamare la funzione UpdateData con il parametro FALSE come riga 10: UpdateData (FALSE) (questo è il modo in cui funziona Visual C ++).

Le righe da 12 a 14 vengono utilizzate per posizionare il cursore alla fine della riga della casella Edi dopo la fine del processo di ricezione dati. Puoi ignorarlo se non è necessario.

Infine, scrivi il codice per la casella di modifica qui sotto (IDC_INPUT) in modo che quando scriviamo, il carattere verrà inviato alla porta COM. Premere Ctrl + W ed eseguire i passaggi seguenti per aggiungere all'evento onChange.

Aggiungi un evento onChange per IDC_INPUT
Figura 7.

Scrivi il seguente codice nell'Input casella di modifica onChange evento:

onChange

Quando l'utente digita un carattere nella casella Modifica, il onChange evento si verifica. Quindi estraiamo l'ultimo carattere nel testo della casella di modifica sottostante che rappresenta la variabile m_txtInput con la riga di comando 11: tmpStr = m_txtInput.Right (1).

Dove tmpStr è una variabile temporanea dichiarata nella riga 9. Si noti che è importante leggere il contenuto della casella di modifica. Dobbiamo chiamare UpdateData con il precedente TRUE parametro come nella riga 10. Infine, chiama il metodo SetOutput dell'oggetto MSComm per inviare il valore della porta COM: m_comm.SetOutput (COleVariant (tmpStr)).

Per inviare un carattere (o una stringa di caratteri) alla porta COM dobbiamo prima "lanciare" il personaggio su COleVariant perché, come mostrato, MSComm funziona solo con COleVariant. Paragrafo COleVariant (tmpStr) fa questo.

Dopo aver scritto il codice per l'evento onChange, puoi premere Ctrl + F5 per eseguire il programma. Utilizzare il AVR_STD_Terminal. Circuito DSN ed eseguire la simulazione come in programmazione con VB. Il risultato è mostrato in Figura 8.

Comunicazione tra AVR e Visual C ++
Figura 8.

Virtual Serial Port Driver

Requisiti: Windows (32-bit e 64-bit): XP(solo Standard)/2003(solo Standard)/2008/ Vista/7/8/10, Windows Server 2012, Windows Server 2016 , 5.46MB taglia
versione 9.0.567 (5 Ag, 2017) Note di rilascio
Categoria: Serial Port Software