Comunique-se entre o AVR e o PC usando a Serial Port Virtual


Este artigo irá falar sobre como se comunicar entre o AVR e o PC de uma maneira simples, mas bastante abrangente. É simples porque eu vou usar uma interface bastante "clássica" para me comunicar entre o AVR e o PC, a interface RS232 via portas COM. Abrangente como eu vou guiá-lo através da transição entre o AVR e o PC, como escrever a interface do programa RS232 no computador e no AVR. Especificamente, este artigo inclui:

Conteúdo


  1. Diagrama esquemático e função dos pinos da porta COM no computador. Circuito AVR para PC via porta COM.
  2. Crie uma porta COM virtual no PC para fins de simulação.
  3. Usar funções na biblioteca de exportação C padrão, como printf, scanf ... no WinAVR.
  4. Escrever programa de porta COM no PC (Visual C ++, Visual Basic)

1. Visão geral da porta COM


Uma porta COM ou Serial Port é uma porta de comunicação que faz parte da forma "antiga" do PC, dos desktops e dos laptops. Hoje, com o surgimento e a "expansão" do padrão USB, a porta COM (e a porta LPT ou a porta paralela) está desaparecendo. Encontre mais informações sobre o que é a porta serial e como ela funciona em nosso novo artigo.

A comunicação da porta COM é RS232 comunicação em série. Este padrão é bastante lento comparado ao USB. No entanto, com a robótica ou controle, o COM-RS232 é muito popular por sua simplicidade e também por causa desta desaceleração. As portas COM nos computadores existentes (quando disponíveis) são na sua maioria de 9 pinos macho. No entanto, em algum lugar, há uma porta COM de 25 pinos, que é quase igual à porta LPT, mas é um macho, enquanto a porta LPT é feminina.

Precisa entender principais pontos sobre modems nulos e pinagem RS 232.

A Figura 1 mostra dois tipos de portas COM e a Tabela 1 resume as funções das portas.

COM de 9 pinos e porta COM de 25 pinos
Figura 1.

pinos na porta COM
Tabela 1

Mais notável no pinos da porta COM são os pinos transmissores de dados de 3 pinos 0V SG (sinal de aterramento), TxD e pinos de recepção de dados RxD. Estes são três pinos básicos para comunicação RS232 e compatíveis com UART no AVR. Os pinos restantes também podem ser usados se o usuário tiver algum conhecimento da organização do registro do PC. Na maioria dos casos, no entanto, apenas três pinos são usados.

Como afirmado no AVR5-UART, os padrões RS232 e UART são geralmente os mesmos em termos de transmissão, taxa de transmissão ... mas variam em voltagem e polaridade. Consulte o exemplo de comparação na Figura 2.

Comparar UART e RS232
Figura 2.

No padrão UART (no AVR), o nível 1 corresponde a alta voltagem (5V, TTL) enquanto que para o RS232 o nível 1 corresponde a baixa voltagem (voltagem negativa, talvez -12V). Claramente, existe a necessidade de um "conversor" entre os dois.

Felizmente, não precisamos projetar essa ponte porque existem CIs dedicados. O MAX232 é um dos CIs de chave UART-RS232 mais usados. Claro, você pode criar um circuito simples com apenas alguns componentes, como capacitores, resistores, diodos e transistores, mas a estabilidade não é garantida.

A Figura 3 mostra como usar o IC Max232 para conectar-se entre o UART no AVR e a porta COM do PC.

Ligue o AVR ao PC via Max232
Figura 3.

O circuito acima só tem o efeito de variar o nível de tensão entre RS232 e UART. Ele não altera o modo de comunicação desses padrões e, portanto, a programação no PC e no AVR não é uma mudança substituta. Na verdade, Max232 tem dois traseiros.

Na Figura 3, usamos apenas o transceptor 1. O pino TxD (pino 3) da porta COM conectada ao R1IN (Entrada de Recebimento 1) do Max232 é correspondente à Saída R1OUT (Receber) 1) deve ser conectado ao receptor RX de o AVR. O mesmo para T1IN e T1OUT. O valor dos capacitores de 10uF é relativamente padrão, mas quando você substitui o capacitor com 1uF, o circuito permanece ativo, mas a distância de transmissão (conector da cabine) será menor (se muito tempo gerará erro de comunicação). Os resistores na Figura 3 só funcionam para proteger portas COM e ICs, portanto, você pode não precisar usar esses resistores sem afetar a operação do circuito. Vcc e GND são fontes de circuitos AVR.

Nota: Se você quiser se comunicar entre dois computadores juntos via porta COM, você precisa usar 1 cabo crossover (Pinos TxD do PCx conectados ao RxD do PC2 e vice-versa) para conectar 2 portas COM juntas.

2. Criar porta COM virtual para simulação


Para fazer a comunicação entre o AVR e o PC através da porta COM, você obviamente precisa de uma porta COM, além disso, você precisa fazer um circuito AVR e conectar o Max232. Infelizmente, nem todos os computadores têm essa porta. Se você quiser apenas aprender como se comunicar com o AVR-PC ou apenas testar um algoritmo específico, talvez simular a solução seja preferível. Para o propósito de simular a comunicação RS232, Proteus é novamente útil para simular transmissões de dados com portas COM.

Portanto, o problema é como criar portas COM virtuais no computador e conectá-las para realizar simulações de comunicação. Por causa da natureza da porta COM é apenas "aberto" (aberto) apenas uma vez, o que significa que os dois softwares não podem abrir a mesma porta.

Nossa idéia é criar duas portas COM virtuais que são "cruzadas" juntas (por exemplo, COM2 e COM3). Na saída do Proteus da UART está conectada à COM2. No software para PC (por exemplo, HyperTerminal) nos conectamos à COM3. Desta forma conseguimos comunicar entre o AVR (modelo Proteus) e o PC (software HyperTerminal).

Existem alguns bons softwares que podem criar portas COM virtuais e conexões virtuais entre eles exatamente conforme exigido por nós. Nesta seção vou apresentar um software Eltima (Virtual Serial Port Driver).

Virtual Serial Port Drive (VSPD) emula portas seriais virtuais e as conecta em pares via cabo de modem nulo virtual. Aplicações em ambas as extremidades do par serão capazes de trocar dados de tal maneira, que tudo escrito na primeira porta aparecerá no segundo e ao contrário.

O VSPD é fácil de usar e estável. Depois de baixar prosseguir com a instalação, encontrar e executar o arquivo "Adicionar par".

Interface do VSPD conforme mostrado na Figura 4.

Interface do software Virtual Serial Port
Figura 4.

Na guia "Portas do gerenciador", o software sugere automaticamente que algumas portas COM virtuais podem ser criadas, você pode selecioná-las novamente e clicar em "Adicionar par" para criar essas duas portas COM. A porta COM virtual criada pelo VSPD aparece na "Lista de dispositivos" do Windows e não se perde quando o usuário desativa o software VSPD. Execute o Gerenciador de Dispositivos do Windows. Na seção Portas (COM & LPT), você verá as portas COM virtuais criadas (veja o exemplo na Figura 5).

Portas COM virtuais e conexões entre elas criadas pelo VSPD
Figura 5.

3. Use a biblioteca de exportação padrão stdio.h no WinAVR


Qualquer pessoa que já tenha aprendido a linguagem de programação C não esquecerá seu primeiro programa "hello world":

Olá Mundo

Este programa simplesmente faz o trabalho de digitar "hello, world" na tela. A impressão de letras é feita pelo "printf" comando na linha 3. O printf comando está no stdio biblioteca chamada biblioteca de entrada/saída padrão. O comando printf no stdio não é apenas para imprimir na tela, mas pode imprimir em qualquer dispositivo de saída, até mesmo imprimir um arquivo em um disco rígido do computador ...

Para o AVR, se você usar o compilador Quando você chamar printf, a string é impressa (saída) no módulo UART (é claro que você tem que instalar os registros UART para ativar o UART primeiro).

CodevisionAVR em si entende UART como o dispositivo de entrada / saída padrão para comandos na biblioteca stdio (printf, scanf ...). No entanto, com o WinAVR (avr-gcc) todo o resto é diferente. Para usar entrada e saída padrão, precisamos declarar um dispositivo de entrada e uma função de entrada "básica". A função básica é uma função definida pelo usuário, cuja tarefa é exportar (ou importar) um caractere para um dispositivo de entrada.

Por exemplo, na comunicação AVR5 - UART, definimos uma função "uart_char_tx" caracteres de saída para UART da seguinte forma:

uart_char_tx

Ou no TextLCD nós olhamos a função "putChar_LCD" para produzir um caractere para o LCD como abaixo:

putChar_LCD

Ambos "uart_char_tx" e "putChar_LCD" como o exemplo acima pode ser usado como uma função de importação "básica" para funções como printf ... no padrão sdtio bibliotecas de exportação. Assumindo a função "uart_char_tx" é usado, ao chamar o printf função, a string é exportada para o UART.

Em contraste, se o "putChar_LCD" função é utilizada como função base, o stdio printf função irá produzir a string de dados para o LCD. Com este método, o tradutor avr-gcc nos permite acessar a biblioteca stdio de forma mais flexível, você pode usar as funções stdio para exportar / importar dados para qualquer dispositivo como terminal UART, TextLCD, LCD gráfico ou mesmo SD, cartão MMC ... você define a função de entrada "básica".

Para ilustrar como usar funções no stdiobiblioteca, vou mostrar um exemplo de saída de dados para TextLCD e uart usando stdio's printf .... TA simulação do circuito para este exemplo é mostrada na Figura 6 abaixo.

Simule exemplo de saída exemplar com biblioteca stdio
Figura 6.

Todos os dados exibidos no LCD e no terminal uart na Figura 6 são feitos através do printf e fprintf funções. Também neste exemplo, o usuário pode inserir um caractere do teclado e o Código ASCII. da chave será impresso no terminal. O código mostrado na List1.

Exportar dados para o LCD e UART com a biblioteca de exportação padrão stdio
Lista 1.

Para usar as funções na biblioteca de saída padrão, precisamos incluir o arquivo de cabeçalho da biblioteca como na linha 4 "#include ".

Nota que ao usar o avr-gcc, as funções relacionadas ao avr -libc estão localizadas no subdiretório "/ avr /" do diretório include.

Por exemplo, o cabeçalho io.h ou interrupt.h contém funções especiais para o avr, quando anexamos estes arquivos especificamos algo como: "#include " ... No entanto, a linguagem C padrão (como stdio.h, math.h, ...) está diretamente no diretório include, ao anexar esses arquivos deve ser escrito diretamente como na linha de código 4. Também porque este exemplo usa LCD, você precisa copiar e incluir a biblioteca myLCD.h como na linha 5 (revisão TextLCD).

Como discutido acima, para usar as funções no stdio, precisamos de funções básicas de entrada / saída. As linhas de 7 a 11 são funções de saída uart denominadas "uart_char_tx", que será usado como função base para as funções de saída do stdio. O "uart_char_tx" função foi discutida na aula UART, onde uma pequena mudança foi feita para a linha 8 "E se (chr == '\ n') uart_char_tx ('\ r')", esta linha tem o significado de que quando o usuário deseja produzir o caracter "\ n", a função "uart_char_tx" irá mostrar o caractere '\ r'.

Então, se você encontrar um '\ n' (com o código ASCII 10, chamado Line Feed - LF) no final da frase, uma combinação de '\ r' + '\ n' (código '\ r' = 13 Retorno de carro - CR) será enviado para o fluxo. Para entender melhor esse problema, você aprenderá mais sobre a alimentação de linha de retorno de carro (CRLF) no Windows.

Duas linhas de código 13 e 14 são muito importantes ao usar a biblioteca stdio. O significado dessas duas linhas é criar dois "FILE" virtuais (também conhecidos como stream) para exportação de dados. Examinamos a linha 14: criar um fluxo para o UART.

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

Criamos uma variável denominada uartstd (auto-nomeada pelo usuário) que é do tipo FILE (um tipo de dispositivo virtual) e, em seguida, usa a macro "FDEV_SETUP_STREAM" para inicializar e definir os parâmetros para o uartstd. Esta macro tem a função de abrir um fdevopen e atribuir "ferramentas" para importar para o dispositivo.

#define FDEV_SETUP_STREAM (colocar, pegar, rwflag)

O parâmetro anexado "FDEV_SETUP_STREAM" consiste em uma função básica chamada "colocar", uma função básica chamada "pegue" e uma bandeira indicando a função de saída ou entrada do dispositivo que está sendo aberto. Especificamente, na linha 13, a variável uartstd é um "dispositivo virtual" usado para saída de dados (devido à _FDEV_SETUP_WRITE parâmetro).

A ferramenta para saída uartstd é a "uart_char_tx" função que criamos acima. Não há nenhuma função para obter dados de uartstd (get = NULL parâmetro). Você pode imaginar isso: a variável uartstd é uma folha de papel, a função "uart_char_tx" é um "selo" que permite imprimir um caractere em uma folha de papel de parede. Nós atribuímos "uart_char_tx" para usrtstd então toda a impressão em papel uartstd será feita por "uart_char_tx". A função "uart_char_tx" é, portanto, chamada de função base.

Similarmente, na linha 13 nós criamos outro "paper" chamado lcdstd e sua função básica deixa a função "putChar_LCD", que já está definido no myLCD.h library.

As linhas no programa principal das linhas 17 a 25 iniciam o UART e o TextLCD, você pode revisar os artigos relacionados para entender mais. Após a inicialização, a UART e o LCD estão prontos para a exportação de dados. Agora podemos usar as funções na biblioteca stdio como printf ou sprint ... para exportar os dados. Você verá a Figura 6 porque eu a utilizarei para comparar com as linhas de código a seguir. Linha 27 "printf (" Na lan 1 "), o objetivo é imprimir a string "In lan 1" no LCD usando a função printf. No entanto, conforme mostrado na Figura 6, você não vê essa seqüência aparecer.

Agora olhe para a linha 28 "fprintf (& lcdstd,"www.eltima.com")" e olhe novamente para a Figura 6, desta vez você viu a string "www.eltima.com" aparecem no LCD, bem sucedida com a função fprintf. O fprintf function é uma função que envia dados para um dispositivo virtual, onde o primeiro parâmetro da função aponta para o dispositivo e o segundo parâmetro é a sequência de dados a ser impressa. Neste caso, usamos fprintf para exportar o "www.eltima.com" corda para o lcdstd máquina virtual e conseguiu. E quanto à função printf na linha 27? Vamos olhar as linhas de 30 a 32. Linha 30 nós mais uma vez usamos a função printf "printf (" In lan 3 ")" para imprimir o "lan 3" no LCD, mas ainda não é bem sucedido (veja o LCD na Figura 6). Na linha 31 atribuímos "stdout = & lcdstd" em que stdout é uma variável (na verdade, um fluxo ou dispositivo virtual) da linguagem C, que define o dispositivo padrão para entrada de dados. Ao atribuir stdout a lcdstd como linha 31, declaramos que o LCD é o dispositivo de entrada padrão. Então, na linha 32 nós chamamos printf "printf (" Lan lan 4:% i ", x)" nós fomos bem sucedidos.

Desta vez, olhe no LCD e verá a linha "Lan Lan 4: 8205". Aqui 8205 é o valor da variável x na declaração na linha 32. Em resumo, o fprintf função permite a impressão direta para um dispositivo virtual especificado, printf função precisamos atribuir o dispositivo de entrada Precede para a variável stdout. Dê uma olhada no código das linhas 34 a 37 e as três primeiras linhas no terminal na Figura 6, que você provavelmente já conhece por si mesmo.

Finalmente, o servidor de interrupção de dados UART está nas linhas de código 41 a 44. Neste exemplo, simplesmente executamos " Ma ASCII: " linha com o valor recebido do "O UART está contido no registro UDR: "fprintf (& uartstd," Ma ASCII:% i \ n ", UDR)".

Para entender completamente o stdio biblioteca em WinAVR você precisa ler a documentação "avr-libc Manual", a seção de instalações de IO padrão.

4. Programação com porta COM usando Visual Basic e Visual C ++


Em muitos casos, os requisitos de comunicação exigem um maior grau de complexidade, como armazenamento de dados ou gráficos variáveis, de modo que os usuários precisam escrever seus próprios programas por conta própria. Este tutorial mostra como gravar programas em um computador para transmitir e receber dados de uma porta COM no Visual Basic e no Visual C ++ 6.0. Note que o propósito deste artigo é sobre o AVR, então o aplicativo escrito no Windows acabou de apresentar uma maneira simples de entender o princípio. Para desenvolver aplicativos mais sofisticados, os leitores precisam se equipar com o conhecimento da programação do Windows. Em todos os tutoriais abaixo, presumo que o mínimo de leitores saiba como criar um projeto no Visual Basic ou Visual C ++.

1. Escreva um programa de porta COM usando o Visual Basic 6.0


Desde as versões posteriores do Windows 2000, a comunicação com portas de computadores tradicionais, como portas LPT, no Windows era relativamente difícil. No entanto, com portas COM, é uma sorte que a Microsoft fornece uma ferramenta (na verdade, um controle) chamado "Microsoft Communication Control" ou MSComm para abreviar. MSComm apareceu em software de programação MS popular como Visual Basic ou Visual C ++ como um "controle". Como um "controlador" projetado para portas COM, o MSComm contém todas as ferramentas necessárias para se comunicar com essa porta, o trabalho do programador é simplesmente declarar e usar. Para ilustrar como usar o MSComm no Visual Basic, siga as instruções abaixo.

Executar o Visual Basic 6, vá para o menu "Arquivo / novo projeto" e crie um "Standard EXE". Você verá um projeto chamado "Projeto1" com uma caixa de diálogo de plano de fundo chamada Form1. Você pode nomear qualquer projeto e formulário principal. Na barra de ferramentas Toolbox, clique no controle "textbox" e desenhe duas caixas de texto principais txtOuput e txtInput (renomear caixas de texto na janela Propriedades. no canto inferior direito, direito). Com txtOutput, defina o parâmetro Múltiplo para True e ScrollBars para "3 - Ambos"

Em seguida, coloque o controle MSComm no formulário principal. Por padrão, o controle MSComm não está disponível na caixa de ferramentas do Visual Basic, precisamos adicioná-lo à caixa de ferramentas antes de usá-lo. Para adicionar o MSComm à caixa de ferramentas, selecione o menu "Projeto / componentes". Você verá uma caixa de diálogo chamada Componentes. Encontre e clique no "Microsoft Comm Control 6.0" como mostrado na figura e clique em OK. Agora, na caixa de ferramentas do VB você verá o ícone do MSComm aparecer. Clique neste ícone e desenhe um objeto MSComm no formulário principal. Manter o nome padrão deste objeto é MSComm1.

Escreva um código:

A finalidade deste exemplo é a seguinte: Os dados recebidos da porta COM são exibidos no txtOutput caixa de texto, e quando o usuário digitar 1 caracteres no txtInput caractere será transmitido pela porta COM.

Primeiro, dê um duplo clique no formulário principal, escreva o seguinte código no Form_Load () event:

Form_Load

A finalidade deste código é definir os parâmetros para MSComm1.

  • CommPort parâmetro = 3 significa que queremos conectar à porta COM3. Este parâmetro varia de acordo com a porta COM com a qual queremos nos comunicar.

    Configuração de parâmetro = "38400, N, 8.1" significa taxa de transmissão = 38400, sem bit de paridade, comprimento de quadro é 8 e 1 bit de parada.

  • RThreshold = 1 significa que quando houver 1 caractere para a porta COM, a interrupção de recebimento de dados ocorrerá.
  • InputLen = 1 significa que, ao ler dados do buffer de recebimento, vamos ler um caractere (1 byte).
  • PortOpen = True permitindo que portas COM "abertas" estejam prontas para comunicar.


  • Em seguida, clique duas vezes no ícone MSComm1 no formulário principal para gravar o código no evento MSComm1_onComm ():
MSComm1

O onComm() evento é essencialmente um Manipulador de interrupção MSComm. Quando há um byte de dados enviado para o buffer da porta COM (o número de bytes especificado pelo RThreshold), o onComm evento irá ocorrer, neste evento, vamos escrever o código para receber e processar os dados. se. Linha 2, declaramos uma variável temporária chamada InputText com tipo de dados de string. Note que o evento onComm pode ocorrer por uma variedade de razões, onde nos preocupamos apenas com o caso dos dados recebidos, a linha 3 é uma espécie de evento "filter", apenas executamos a linha de código enquanto o evento comEvReceive ocorre (os dados é recuperado):

E se Me.MSComm1.CommEvent = comEvReceive Então. A única coisa importante para ler os dados enviados para COM é ler o buffer de entrada do MSComm como na linha 4:InputText = MSComm1.Input. Após este comando, os dados estarão contidos na variável temporária InputText. Em seguida, apenas aumentamos os caracteres recebidos no conteúdo da caixa de texto txtOutput para exibir na tela (linha 5): txtOutput.Text = txtOutput.Text + InputText. A linha 6 é responsável por colocar o cursor no final do conteúdo de txtOutput para facilitar a visualização dos dados.

comEvReceive

Por fim, clique duas vezes na caixa de texto Entrada de texto e procure o evento KeyPress para escrever as seguintes linhas de código:

O txtInput_KeyPress evento ocorre quando um usuário pressiona uma tecla txtInput. A linha Me.MSComm1.Output = Chr (KeyAscii) faz o envio do valor de KeyAscii para a porta COM, onde KeyAscii é o ASCII código da tecla pressionada.

Você terminou de escrever a porta COM através do Visual Basic. Para testar seu programa, faça a seguinte simulação:

  • Use o software VSPD para criar duas portas COM virtuais COM2 e COM3, cruzá-las juntas (consulte a seção da porta COM). virtual).
  • Olhe na pasta que contém o AVR_STD exemplo e execute o arquivo de simulação usando o Proteus AVR_STD_Terminal.DSN software.
  • De volta ao Visual Basic, clique no botão Run ou F5 para executar o novo projeto.
  • Clique em Executar no Proteus para simular o circuito AVR_STD_Terminal.DSN. Você verá algum texto aparecendo txtOutput. Clique txtInput e digite qualquer chave para ver o resultado. Então você escreveu com sucesso um aplicativo COM com porta COM no Visual Basic.

2. Escreva um programa de porta COM usando o Visual C ++ 6.0


Esta parte do tutorial analisa como usar uma porta COM como o exemplo acima, mas usa o Microsoft Visual C ++ (VC ++). O objetivo principal é orientar como usar o MSComm no VC ++, portanto, apresentarei partes muito incompletas, como a criação de um projeto no VC ++. Os leitores precisam se equipar com mais conhecimento sobre programação VC ++. Um dos ótimos tutoriais para iniciantes é "Ensine-se ao Visual C ++ 6 em 21 Dias" de Sams Teach Yourself, que pode ser lido se necessário.

A partir do VC ++, vá ao menu "Arquivo / Novo" para criar um novo projeto. Selecione o tipo de projeto como "MFC AppWizard (exe)", no nome da caixa Nome do Projeto, o projeto é AVR_PC, clique em OK. Na segunda caixa de diálogo, selecione "Baseado em caixa de diálogo" para o tipo de projeto e clique em Concluir para criar o projeto (outras etapas para o padrão).

Quando o novo projeto é criado, uma caixa de diálogo é exibida com os botões "OK" e "Cancelar". Use a ferramenta "Editar" para adicionar 2 "caixas de edição" e reorganizar a interface. Clique com o botão direito do mouse na caixa Edit e selecione Proterties from Popup_menu, por sua vez, mude o ID das 2 caixas Edit para IDC_OUTPUT e IDC_INPUT.

Como no VB, controle MSComm não aparece por padrão na caixa de ferramentas do VC ++, que precisamos adicionar quando queremos usar esse controle. Vá para o menu "Project / Add to Project / Components e Controls ...". Quando a caixa de diálogo "Componentes e Control Gallery" aparecer, selecione a pasta "Controles Registros ActiveX" e navegue até o arquivo "Microsoft Communications Control, Versão 6.0" e clique no botão Inserir e, em seguida, clique em OK quando fizer alguma pergunta. Clique no botão Fechar para fechar a caixa de diálogo. Neste ponto, o ícone do MSComm aparecerá na caixa de ferramentas do VC ++. Clique no ícone do MSComm e desenhe um controle na caixa de diálogo principal do projeto. Por padrão, esse controle é denominado IDC_MSCOMM1.

A programação em VC ++ é mais difícil que VB (para iniciantes). Propriedades de controles como caixa de edição não são diretamente acessíveis como Caixa de texto no VB. Por exemplo, para atribuir e exibir uma string ou um número para a caixa de edição, temos que executar a atribuição e atualização de dados através de variáveis intermediárias. Nesta etapa, criamos duas variáveis para as duas caixas de edição.

Clique no "Visão / ClassWizard" menu ou o "Ctrl + W" combinação de teclas, no "MFC ClasWizard" caixa de diálogo, selecione a guia "Variáveis de membro". Clique na linha IDC_OUTPUT, Clique no "Adicionar variável ..." botão e digite o nome da variável "m_txtOutput" com o tipo é CString.

Repita as etapas acima para criar uma variável chamada "m_txtInput" para "IDC_INPUT". Finalmente, crie uma variável chamada "m_comm" para IDC MSCOMM1. Clique em OK para fechar a caixa de diálogo MFC ClassWizard. De agora em diante, só precisamos nos lembrar das 3 variáveis "m_txtOutput", "m_txtInput", "m_comm" quando queremos acessar as caixas de edição e MSComm ao escrever o código.

Escreva um código:

Pressione Ctrl + W para reabrir ClassWizard, desta vez escolha o "Mapas de mensagens" guia, no "Nome da classe" caixa garantir que "CAVR_PCDlg" está selecionado.No ID do objeto, selecione "CAVR_PCDlg" Mensagens" encontre e selecione "WM_INITDIALOGS" então clique "Editar código".

Agora você pode escrever código para o "OnInitDilaog ()" event, que é um evento que ocorre quando você executa o programa e o diálogo principal é iniciado. Então, vamos definir os parâmetros para m_comm aqui (m_comm é o nome da variável que representa o IDC_MSCOMM1 controle que criamos nas etapas acima). Adicione as seguintes linhas após o "// TODO: Adicionar inicialização extra aqui " linha:

Essas cinco linhas de código correspondem às cinco linhas no Form_Load () Seção de o projeto VB que abordamos anteriormente, então não preciso elaborar essas linhas de código.

Form_Load

Em seguida, vamos escrever o código para o onComm evento do controle MSComm, antes de gravar o código de imprensa Ctrl + W para exibir a caixa de diálogo ClassWizard e execute as seis etapas para adicionar o evento onComm ao projeto.

Escreva o código sa no onComm evento:

onComm

Como mencionado acima, m_comm é uma variável que representa o MSComm. O manuseio de portas COM agora é feito através da variável m_comm. Na linha 4 declaramos uma sub-variável strInput do tipo CString que contém o valor do último. Assim como no VB, o evento onComm pode acontecer por vários motivos.

Nós só nos preocupamos com o caso onde há dados para buffer, a linha 5 permite filtrar o evento: E se (m_comm. GetCommEvent () == 2). Linha 6, declaramos uma sub-variável chamada in_dat com o COleVariant tipo. COleVariant é a classe do MFC, seu nome é uma combinação de C + OLE + VARIANT em que OLE é "Vinculação de Objeto Incorporada""É um tipo de objeto que não está disponível que é "incorporado em, MSComm é um tipo OLE.

VARIANTE é um tipo de variável desconhecido. Quando você tem um x ​​variável, às vezes você deseja atribuir um valor numérico para x, mas às vezes você quer atribuir uma string para x. Então declare x é VARIANTE. No caso do MSComm, os dados de entrada e saída desse objeto são "desconhecidos" ou "VARIANT".

Na linha 7 nós simplesmente obtemos o valor de m_comm na variável in_dat: in_dat = m_comm.GetInput(). A próxima linha "extraímos" o elemento string da variável in_dat e atribua a variável strInput: strInput = in_dat.bstrVal (de um modo relativo, você pode alterar in_dat para CString e atribuí-lo a strInput).

Nós temos que extrair CString porque a caixa de edição mostra apenas CString. Para exibir os dados recebidos na caixa de edição ( IDC_OUTPUT ) nós incrementamos a variável m_txtOutput (representado pela caixa Editar IDC_OUTPUT ) com a linha 9: m_txtOutput + = strInput. Finalmente, para que o valor do m_txtOutput variável para atualizar para a caixa de edição, devemos chamar a função UpdateData com o parâmetro FALSE como linha 10: UpdateData (FALSE) (é assim que o Visual C ++ funciona).

As linhas de 12 a 14 são usadas para colocar o cursor no final da linha da caixa Edi após o término do processo de recebimento de dados. Você pode ignorá-lo se não for necessário.

Finalmente, escreva o código para a caixa de edição abaixo (IDC_INPUT) para que quando digitarmos, o caractere será enviado para a porta COM. pressione Ctrl + W e execute os passos abaixo para adicionar onChange evento.

Adicione um evento onChange para IDC_INPUT
Figura 7.

Escreva o seguinte código na Entrada da Caixa de Edição onChange evento:

onChange

Quando o usuário digita um caractere na caixa Editar, o onChange evento ocorre. Em seguida, extraímos o último caractere no texto da caixa de edição abaixo que representa a variável m_txtInput com a linha de comando 11: tmpStr = m_txtInput.Right (1).

Onde tmpStr é uma variável temporária declarada na linha 9. Observe que é importante ler o conteúdo da caixa Editar. Precisamos ligar UpdateData com o anterior TRUE parâmetro como na linha 10. Finalmente, chame o método SetOutput do objeto MSComm para enviar o valor da porta COM: m_comm.SetOutput (COleVariant (tmpStr)).

Para enviar um caractere (ou string de caracteres) para a porta COM, primeiro precisamos "converter" o caractere para COleVariant porque, como mostrado, o MSComm só funciona com o COleVariant. Parágrafo COleVariant (tmpStr) faz isso.

Depois de escrever o código para o evento onChange, você pode pressionar Ctrl + F5 para executar o programa. Use o AVR_STD_Terminal. Circuito DSN e execute a simulação como na programação com o VB. O resultado é mostrado na Figura 8.

Comunicação entre AVR e Visual C++
Figura 8.

Virtual Serial Port Driver

Requisitos: Windows (32 bits e 64 bits): XP(só Standard)/2003(só Standard)/2008/ Vista/7/8/10, Windows Server 2012, Windows Server 2016 , 5.5MB Tamanho
Versão 9.0.575 (23rd , 2019) Notas de versão
Categoria: Communication Application