Comunícate entre AVR y PC usando el puerto serial virtual


Este artículo tratará sobre cómo comunicarse entre AVR y PC de una manera simple pero bastante completa. Es simple porque voy a usar una interfaz bastante "clásica" para comunicarme entre AVR y PC, la interfaz RS232 a través de los puertos COM. Completo como lo guiaré a través de la transición entre AVR y PC, cómo escribir la interfaz del programa RS232 en la computadora y en el AVR. Específicamente este artículo incluye:

Contenido


  1. Diagrama esquemático y función de los pines del puerto COM en la computadora. Circuito AVR a PC vía puerto COM.
  2. Cree un puerto COM virtual en la PC para fines de simulación.
  3. Use funciones en la biblioteca de exportación de C estándar, como printf, scanf ... en WinAVR.
  4. Escribir programa de puerto COM en PC (Visual C ++, Visual Basic)

1. Visión general del puerto COM


Un puerto COM o un puerto serie es un puerto de comunicaciones que forma parte de la forma "antigua" de la PC, tanto en computadoras de escritorio como en computadoras portátiles. Hoy en día, con la aparición y la "expansión" del estándar USB, el puerto COM (y el puerto LPT o el puerto paralelo) está desapareciendo. Encuentre más información sobre qué es un puerto serie y cómo funciona en nuestro articulo nuevo.

La comunicación del puerto COM es RS232 comunicación serial. Este estándar es bastante lento en comparación con el USB. Sin embargo, con la robótica o el control, el COM-RS232 es muy popular por su simplicidad y también debido a ... esta desaceleración. Los puertos COM en las computadoras existentes (donde estén disponibles) son en su mayoría de 9 pines macho. Sin embargo, en algún lugar hay un puerto COM de 25 pines, que es casi igual al puerto LPT, pero es un macho, mientras que el puerto LPT es hembra.

Necesidad de entender principales puntos sobre módems nulos. y pinout RS 232.

La Figura 1 muestra dos tipos de puertos COM y la Table 1 summarizes the functions of the ports.

Puerto COM de 9 pines y puerto COM de 25 pines
Figura 1.

pines en el puerto COM
tabla 1

Más notable en el pines del puerto COM es el pin 3 V 0V (tierra de señal), los pines del transmisor de datos TxD y los pines receptores de datos RxD. Estos son tres pines básicos para comunicación RS232 y compatibles con UART en AVR. Los pines restantes también pueden usarse si el usuario tiene algún conocimiento de la organización de registro de la PC. En la mayoría de los casos, sin embargo, solo se usan tres pines.

Como se indica en AVR5-UART, los estándares RS232 y UART son generalmente los mismos en términos de transmisión, velocidad de transmisión ... pero varían en voltaje y polaridad. Consulte el ejemplo de comparación en la Figura 2.

Comparar UART y RS232
Figura 2.

En el estándar UART (en AVR), el nivel 1 corresponde a alto voltaje (5V, TTL), mientras que para RS232 el nivel 1 corresponde a bajo voltaje (voltaje negativo, quizás -12 V). Claramente hay una necesidad de un "convertidor" entre los dos.

Afortunadamente, no necesitamos diseñar este puente nosotros mismos porque hay IC dedicados. MAX232 es uno de los circuitos integrados de conmutadores UART-RS232 más utilizados. Por supuesto, puede crear un circuito simple con solo unos pocos componentes, como condensadores, resistencias, diodos y transistores, pero la estabilidad no está garantizada.

La Figura 3 muestra cómo usar el Max232 IC para conectarse entre UART en el AVR y el puerto COM de la PC.

Conecte AVR a la PC a través de Max232
Figura 3.

El circuito anterior solo tiene el efecto de variar el nivel de voltaje entre RS232 y UART. No cambia el modo de comunicación de estos estándares y, por lo tanto, la programación en PC y AVR no es un sustituto, cambie. De hecho, Max232 tiene dos travesaños.

En la Figura 3, solo usamos el transceptor 1. El pin TxD (pin 3) del puerto COM conectado al R1IN (Recepción 1 Entrada) de Max232 corresponde a la Salida R1OUT (Recepción) 1) debe estar conectado al receptor RX de el AVR. Lo mismo para T1IN y T1OUT. El valor de los condensadores de 10uF es relativamente estándar, pero cuando reemplaza el condensador con 1uF, el circuito permanece activo pero la distancia de transmisión (conector de la cabina) será más corta (si es demasiado larga generará un error de comunicación). Las resistencias de la Figura 3 solo funcionan para proteger los puertos COM y los circuitos integrados, por lo que es posible que no necesite usar estas resistencias sin afectar el funcionamiento del circuito. Vcc y GND son fuentes de circuitos AVR.

Nota: Si desea comunicarse entre dos computadoras a través del puerto COM, debe usar 1 cable cruzado (Los pines TxD de PCx conectados a RxD de PC2 y viceversa) para conectar 2 puertos COM juntos.

2. Crear puerto COM virtual para simulación


Para realizar la comunicación entre el AVR y la PC a través del puerto COM, obviamente necesita un puerto COM, además necesita hacer un circuito AVR y conectar el Max232. Desafortunadamente, no todas las computadoras tienen este puerto. Si solo desea aprender cómo comunicarse con AVR-PC o simplemente desea probar un algoritmo en particular, tal vez sea preferible simular la solución. Con el fin de simular la comunicación RS232, Proteus Nuevamente es útil para simular transmisiones de datos con puertos COM.

Entonces, el problema es cómo crear puertos COM virtuales en la computadora y conectarlos para realizar simulaciones de comunicación. Debido a la naturaleza del puerto COM, solo está "abierto" (abierto) solo una vez, lo que significa que los dos programas no pueden abrir el mismo puerto.

Nuestra idea es crear dos puertos COM virtuales que se "crucen" juntos (por ejemplo, COM2 y COM3). En la salida de Proteus del UART está conectado a COM2. En el software para PC (por ejemplo, HyperTerminal) nos conectamos a COM3. De esta manera pudimos comunicarnos entre el AVR (modelo Proteus) y la PC (software HyperTerminal).

Hay algunos buenos programas que pueden crear puertos COM virtuales y conexiones virtuales entre ellos exactamente como lo solicitamos nosotros. En esta sección introduciré un software Eltima (Virtual Serial Port Driver).

Virtual Serial Port Drive (VSPD) Emula los puertos serie virtuales y los conecta en pares a través del cable de módem nulo virtual. Las aplicaciones en ambos extremos del par podrán intercambiar datos de tal manera que todo lo escrito en el primer puerto aparecerá en el segundo y hacia atrás.

VSPD es fácil de usar y estable. Después descargando Continúe con la instalación, busque y ejecute el archivo "Agregar par".

Interfaz de VSPD como se muestra en la Figura 4.

Interfaz de software de puerto serie virtual
Figura 4.

En la pestaña "Puertos de administrador", el software sugiere automáticamente que se pueden crear un par de puertos COM virtuales, puede seleccionarlos nuevamente y hacer clic en "Agregar par" para crear estos dos puertos COM. El puerto COM virtual creado por VSPD aparece en la "Lista de dispositivos" de Windows y no se pierde cuando el usuario desactiva el software VSPD. Ejecute el Administrador de dispositivos de Windows. En la sección Puertos (COM y LPT) verá los puertos COM virtuales creados (vea el ejemplo en la Figura 5).

Puertos COM virtuales y conexiones entre ellos creados por VSPD
Figura 5.

3. Utilice la biblioteca estándar de exportación stdio.h en WinAVR


Cualquiera que haya aprendido el lenguaje de programación C no olvidará su primer programa "hola mundo":

Hola Mundo

Este programa simplemente hace el trabajo de escribir "hola, mundo" en la pantalla. La impresión de la letra es hecha por el "printf" comando en la línea 3. La printf comando está en el stdio biblioteca llamada la biblioteca de entrada / salida estándar. El comando printf en stdio no es solo para imprimir en la pantalla sino que puede imprimir en cualquier dispositivo de salida, incluso imprimir un archivo en el disco duro de una computadora ...

Para AVR, si usa el compilador Cuando llama a printf, la cadena imprime (emite) el módulo UART (por supuesto, debe instalar los registros de UART para activar primero UART).

CodevisionAVR por sí mismo entiende a UART como el dispositivo de entrada / salida predeterminado para los comandos en la biblioteca stdio (printf, scanf ...). Sin embargo, con WinAVR (avr-gcc) todo lo demás es diferente. Para utilizar la entrada y salida estándar, debemos declarar un dispositivo de entrada y una función de entrada "básica". La función básica es una función definida por el usuario, cuya tarea es exportar (o importar) un carácter a un dispositivo de entrada.

Por ejemplo, en la comunicación AVR5 - UART definimos una función "uart_char_tx" para enviar los caracteres a UART de la siguiente manera:

uart_char_tx

O en TextLCD nos fijamos en la función. "putChar_LCD" para enviar un carácter a la pantalla LCD como se muestra a continuación:

putChar_LCD

Ambos "uart_char_tx" y "putChar_LCD" como el ejemplo anterior se puede utilizar como una función de importación "básica" para funciones como printf ... en estándar sdtio bibliotecas de exportación. Asumiendo la función "uart_char_tx" se utiliza, al llamar al printf función, la cadena se exporta a la UART.

En contraste, si el "putChar_LCD" función se utiliza como la función de base, la stdio printf La función emitirá la cadena de datos a la pantalla LCD. Con este método, el traductor avr-gcc nos permite acceder a la biblioteca stdio de manera más flexible, puede usar las funciones stdio para exportar / importar datos a cualquier dispositivo como el terminal UART, TextLCD, LCD gráfico o incluso la tarjeta SD, MMC ... Se define la función de entrada "básica".

Para ilustrar cómo usar funciones en el stdio biblioteca, mostraré un ejemplo de salida de datos a TextLCD y uart utilizando printf de stdio .... La simulación de circuito para este ejemplo se muestra en la Figura 6 a continuación.

Ejemplo de ejemplo simulado de salida con la biblioteca stdio
Figura 6.

Todos los datos mostrados en la pantalla LCD y el terminal uart en la Figura 6 se realizan a través de printf y fprintf funciones. También en este ejemplo, el usuario puede ingresar un carácter desde el teclado y código ASCII. De la clave se imprimirá en el terminal. El código que se muestra en List1.

Exportar datos a LCD y UART con la biblioteca de exportación estándar stdio
Lista 1.

Para usar las funciones en la biblioteca de salida estándar, debemos incluir el archivo de encabezado de la biblioteca como en la línea 4 "#include ".

Nota que al usar avr-gcc, las funciones relacionadas con avr -libc se encuentran en el subdirectorio "/ avr /" del directorio de inclusión

Por ejemplo, el encabezado io.h o interrupt.h contiene funciones especiales para avr, cuando adjuntamos estos archivos especificamos algo como: "#include " ... Sin embargo, el lenguaje C estándar (como stdio.h, math.h, ...) está directamente en el directorio de inclusión, al adjuntar estos archivos debe escribirse directamente como en la línea de código 4. También porque este ejemplo usa LCD, necesita copiar e incluir la biblioteca myLCD.h como en la línea 5 (revise TextLCD).

Como se mencionó anteriormente, para usar las funciones en stdio necesitamos funciones básicas de entrada / salida. Las líneas del 7 al 11 son funciones de salida de uart llamadas "uart_char_tx", que se utilizará como función base para las funciones de salida de stdio. Los "uart_char_tx" La función se discutió en la lección UART, donde se realizó un pequeño cambio en la línea 8 "Si (chr == '\ n') uart_char_tx ('\ r')", esta línea tiene el significado de que cuando el usuario desea generar el carácter "\ n", la función "uart_char_tx" generará el carácter '\ r'.

Así que si te encuentras con un '\ n' (con el código ASCII 10, llamado Line Feed - LF) al final de la oración, una combinación de '\ r' + '\ n' (código '\ r' = 13 llamado retorno de carro - CR) será enviado a la corriente. Para comprender mejor este problema, aprenderá más sobre la alimentación de línea de retorno de carro (CRLF) en Windows.

Dos líneas de código 13 y 14 son muy importantes cuando se usa la biblioteca stdio. El significado de estas dos líneas es crear dos "ARCHIVOS" virtuales (también conocidos como flujo) para la exportación de datos. Examinamos la línea 14: creamos un flujo para el UART.

estático FILE uartstd = FDEV_SETUP_STREAM (uart_char_tx, NULL, _FDEV_SETUP_WRITE);

Creamos una variable llamada uartstd (nombre propio del usuario) que es de tipo FILE (un tipo de dispositivo virtual), luego usamos la macro "FDEV_SETUP_STREAM" para inicializar y establecer los parámetros para uartstd. Esta macro tiene la función de abrir un fdevopen y asignar "herramientas" para importar en el dispositivo.

#define FDEV_SETUP_STREAM (put, get, rwflag)

El parametro adjunto "FDEV_SETUP_STREAM" Consiste en una función básica llamada "poner", una función básica llamada "obtener" y una bandera que indica la función de salida o entrada del dispositivo que se está abriendo. Específicamente, en la línea 13, la variable uartstd es un "dispositivo virtual" utilizado para la salida de datos (debido a la _FDEV_SETUP_WRITE parámetro).

La herramienta para la salida de uartstd es la "uart_char_tx" función que hemos creado anteriormente. No hay ninguna función para obtener datos de uartstd (get = NULL parámetro). Puedes imaginar esto: la variable uartstd es una hoja de papel, la función "uart_char_tx" es un "sello" que permite imprimir un carácter en una hoja de uartstdpaper. Asignamos "uart_char_tx" Para usrtstd, toda la impresión en papel uartstd se realizará "uart_char_tx". La función "uart_char_tx" Por lo tanto, se llama la función de base.

Del mismo modo, en la línea 13 creamos otro "papel" llamado lcdstd Y su función básica deja la función. "putChar_LCD", que ya está definido en el myLCD.h biblioteca.

Las líneas en el programa principal de las líneas 17 a 25 inician UART y TextLCD, puede revisar los artículos relacionados para comprender mejor Después del arranque, UART y LCD están listos para la exportación de datos. Ahora podemos usar las funciones en la librería stdio como printf o sprint ... Para exportar los datos. Verá la Figura 6 porque la usaré para comparar con las siguientes líneas de código. Línea 27 "printf (" En lan 1 "), el propósito es imprimir la cadena" En lan 1 "a la pantalla LCD usando la función printf. Sin embargo, como se muestra en la Figura 6, no ve aparecer esta cadena.

Ahora mira la linea 28 "fprintf (& lcdstd,"www.eltima.com")" y mira de nuevo la Figura 6, esta vez has visto la cadena "www.eltima.com" aparece en la pantalla LCD, con éxito con la función fprintf. Los fprintf función es una función que envía datos a un dispositivo virtual, donde el primer parámetro de la función apunta al dispositivo y el segundo parámetro es la cadena de datos para imprimir. En este caso, utilizamos fprintf para exportar el "www.eltima.com" cadena a la lcdstd Máquina virtual y exitosa. ¿Qué pasa con la función printf en la línea 27? Veamos las líneas del 30 al 32. La línea 30 una vez más usamos la función printf "printf (" En lan 3 ")" para imprimir el "lan 3" en la pantalla LCD pero aún no tiene éxito (vea la pantalla LCD en la Figura 6). En la línea 31 asignamos "stdout = & lcdstd" donde stdout es una variable (en realidad una transmisión o dispositivo virtual) del lenguaje C, que define el dispositivo predeterminado para la entrada de datos. Al asignar stdout a lcdstd como línea 31, declaramos que LCD es el dispositivo de entrada predeterminado. Así, en la línea 32 llamamos printf "printf (" Lan lan 4:% i ", x)" tuvimos éxito.

Esta vez, mire en la pantalla LCD y verá que aparece la línea "Lan Lan 4: 8205". Aquí 8205 es el valor de la variable x en la declaración en la línea 32. En resumen, la función fprintf permite imprimir directamente en un dispositivo virtual específico mientras usa printf función que necesitamos para asignar el dispositivo de entrada. Precede a la variable stdout. Eche un vistazo al código de las líneas 34 a 37 y las tres primeras líneas en el terminal en la Figura 6, que probablemente ya sepa por sí mismo.

Finalmente, el servidor de interrupción de datos UART está en las líneas de código 41 a 44. En este ejemplo, simplemente ejecutamos " Ma ASCII: " línea con el valor recibido de "El UART está contenido en el registro UDR: "fprintf (& uartstd," Ma ASCII:% i \ n ", UDR)".

Para entender completamente la stdio En la biblioteca de WinAVR, debe leer la documentación del "Manual de avr-libc", la sección Instalaciones de IO estándar.

4. Programación con puerto COM usando Visual Basic y Visual C ++


En muchos casos, los requisitos de comunicación requieren un mayor grado de complejidad, como el almacenamiento de datos o el graficado de variables, por lo que los usuarios deben escribir sus propios programas por su cuenta. Este tutorial le muestra cómo escribir programas en una computadora para transmitir y recibir datos de un puerto COM en Visual Basic y Visual C ++ 6.0. Tenga en cuenta que el propósito de este artículo es en AVR, por lo que la aplicación escrita en Windows acabo de presentar una forma sencilla de comprender el principio. Para desarrollar aplicaciones más sofisticadas, los lectores deben equiparse con el conocimiento de la programación de Windows. En todos los tutoriales a continuación, asumo que los menos lectores saben cómo crear un proyecto en Visual Basic y / o Visual C ++.

1. Escribe un programa de puerto COM usando Visual Basic 6.0


Desde las últimas versiones de Windows 2000, la comunicación con los puertos de computadora tradicionales, como los puertos LPT, en Windows era relativamente difícil. Sin embargo, con los puertos COM, es una suerte que Microsoft proporcione una herramienta (en realidad un control) llamada "Control de Comunicación de Microsoft" o MSComm, para abreviar. MSComm ha aparecido en el popular software de programación de MS como Visual Basic o Visual C ++ como un "control". Como un "controlador" diseñado para puertos COM, MSComm contiene todas las herramientas necesarias para comunicarse con este puerto, el trabajo del programador es simplemente declararlo y usarlo. Para ilustrar cómo usar MSComm en Visual Basic, siga las instrucciones a continuación.

Ejecute Visual Basic 6, vaya al menú "Archivo / Nuevo proyecto" y cree un "EXE estándar". Verá un Proyecto llamado "Proyecto1" con un cuadro de diálogo de fondo llamado Form1. Puedes nombrar cualquier proyecto y formulario principal. Desde la barra de herramientas del cuadro de herramientas, haga clic en el control "cuadro de texto" y dibuje dos cuadros de texto principales llamados txtOuput y txtInput (Cambie el nombre de los cuadros de texto en la ventana Propiedades. En la esquina inferior derecha, derecha) .Con txtOutput, establezca el parámetro Múltiple en Verdadero y las barras de desplazamiento en "3 - Ambos"

A continuación, coloque el control MSComm en el formulario principal. De manera predeterminada, el control MSComm no está disponible en la Caja de herramientas de Visual Basic, debemos agregarlo a la Caja de herramientas antes de usarlo. Para agregar MSComm al cuadro de herramientas, seleccione el menú "Proyecto / Componentes". Verá un cuadro de diálogo llamado Componentes. Busque y haga clic en "Microsoft Comm Control 6.0" como se muestra en la imagen y haga clic en Aceptar. Ahora, en la caja de herramientas de VB verá aparecer el icono de MSComm. Haga clic en este icono y dibuje un objeto MSComm en el formulario principal. Mantener el nombre predeterminado de este objeto es MSComm1.

Escribe un codigo :

El propósito de este ejemplo es el siguiente: Los datos recibidos del puerto COM se muestran en la txtOutput cuadro de texto, y cuando el usuario escribe 1 caracteres en la txtInput El carácter se transmitirá a través del puerto COM.

Primero, haga doble clic en el formulario principal, escriba el siguiente código en el Form_Load () event:

Form_Load

El propósito de este código es establecer los parámetros para MSComm1.

  • CommPort parámetro = 3 significa que queremos conectarnos al puerto COM3. Este parámetro varía según el puerto COM con el que queremos comunicarnos.

    Parámetro Ajuste = "38400, N, 8.1" significa velocidad de transmisión = 38400, sin bit de paridad, la longitud del cuadro es 8 y 1 bit de parada.

  • RThreshold = 1 significa que cuando hay 1 carácter en el puerto COM, se producirá una interrupción en la recepción de datos.
  • InputLen = 1 significa que al leer datos del búfer de recepción, leeremos un carácter (1 byte).
  • PortOpen = True permitiendo que los puertos COM "abiertos" estén listos para comunicarse.


  • A continuación, haga doble clic en el icono de MSComm1 en el formulario principal para escribir el código en el MSComm1_onComm () event:
MSComm1

Los onComm() evento es esencialmente un Controlador de interrupciones MSComm. Cuando hay un byte de datos enviados al búfer del puerto COM (el número de bytes especificado por el umbral RT), el onComm ocurrirá el evento, en este caso escribiremos el código para recibir y procesar los datos. ya sea. En la línea 2 declaramos una variable temporal llamada InputText con el tipo de datos de cadena. Tenga en cuenta que el evento onComm puede ocurrir por una variedad de razones, donde solo nos preocupamos por el caso de los datos entrantes, la línea 3 es una especie de evento "filtro", solo ejecutamos la línea de código mientras que el evento comEvReceive ocurre (los datos se recupera):

Si Me.MSComm1.CommEvent = comEvReceive Entonces. Lo único importante para leer los datos enviados a COM es leer el búfer de entrada de MSComm como en la línea 4:InputText = MSComm1.Input. Después de este comando, los datos estarán contenidos en la variable temporal InputText. A continuación, simplemente incrementamos los caracteres recibidos en el contenido del cuadro de texto txtOutput para mostrar en la pantalla (línea 5): txtOutput.Text = txtOutput.Text + InputText. La línea 6 es responsable de llevar el cursor al final del contenido de txtOutput para una fácil visualización de los datos.

comEvReceive

Finalmente, haga doble clic en el cuadro de texto de entrada de texto y busque el evento KeyPress para escribir las siguientes líneas de código:

El txtInput_KeyPress evento ocurre cuando un usuario presiona una tecla txtInput. La línea Me.MSComm1.Output = Chr (KeyAscii) hace el envío del valor de KeyAscii al puerto COM, donde KeyAscii es el ASCII Código de la tecla pulsada..

Ha terminado de escribir el puerto COM a través de Visual Basic. Para probar su programa, realice la siguiente simulación:

  • Utilice el software VSPD para crear dos puertos COM virtuales COM2 y COM3, cámbielos (consulte la sección Puerto COM). virtual).
  • Busque en la carpeta que contiene el AVR_STD Ejemplo y ejecute el archivo de simulación usando el Proteus AVR_STD_Terminal.DSN software.
  • De vuelta a Visual Basic, haga clic en el botón Ejecutar o F5 para ejecutar el nuevo proyecto.
  • Haga clic en Ejecutar en Proteus para simular el circuito. AVR_STD_Terminal.DSN. Verás un texto que aparece txtOutput. Hacer clic txtInput y escriba cualquier tecla para ver el resultado. Por lo tanto, se ha escrito correctamente una aplicación COM con puerto COM en Visual Basic.

2. Escribe un programa de puerto COM usando Visual C ++ 6.0


Esta parte del tutorial trata sobre cómo usar un puerto COM como el ejemplo anterior, pero usa Microsoft Visual C ++ (VC ++). El propósito principal es guiar cómo usar MSComm en VC ++, por lo que presentaré partes muy incompletas como crear un proyecto en VC ++. Los lectores deben equiparse con más conocimientos sobre la programación de VC ++. Uno de los grandes tutoriales para principiantes es "Enseña a ti mismo Visual C ++ 6 en 21 días" por Sams Teach Yourself, que puedes leer si es necesario.

Desde VC ++, vaya al menú "Archivo / Nuevo" para crear un nuevo proyecto. Seleccione el tipo de proyecto como "MFC AppWizard (exe)", en el nombre del cuadro Nombre del proyecto, el proyecto es AVR_PC, haga clic en Aceptar. En el segundo cuadro de diálogo, seleccione "Basado en diálogos" para el tipo de proyecto y haga clic en Finalizar para crear el proyecto (otros pasos predeterminados).

Cuando se crea el nuevo proyecto, aparece un cuadro de diálogo con los botones "Aceptar" y "Cancelar". Usar la herramienta "Editar" para agregar 2 "Cuadros de edición" y reorganizar la interfaz. Haga clic con el botón derecho en el cuadro Editar y seleccione Propiedades en el menú emergente, a su vez, cambie el ID de los 2 cuadros Edición IDC_OUTPUT y IDC_INPUT.

Al igual que en VB, Control MSComm no aparece de manera predeterminada en la Caja de herramientas de VC ++, que debemos agregar cuando queremos usar este control. Vaya al menú "Proyecto / Agregar a Proyecto / Componentes y Controles ...". Cuando aparezca el cuadro de diálogo "Galería de componentes y controles", seleccione la carpeta "Controles ActiveX registrados" y navegue hasta el archivo "Control de comunicaciones de Microsoft, versión 6.0" y haga clic en el botón Insertar, luego haga clic en Aceptar cuando se le pregunte. Haga clic en el botón Cerrar para cerrar el cuadro de diálogo. En este punto, el icono de MSComm aparecerá en la caja de herramientas de VC ++. Haga clic en el icono de MSComm y dibuje un control en el diálogo principal del proyecto. De forma predeterminada, este control se denomina IDC_MSCOMM1.

Programar en VC ++ es más difícil que VB (para los novatos). Las propiedades de los controles, como el cuadro de edición, no son accesibles directamente como Textbox en VB. Por ejemplo, para asignar y mostrar una cadena o un número en el cuadro Editar, debemos asignar y actualizar datos a través de variables intermedias. En este paso creamos dos variables para los 2 cuadros de edición.

Haga clic en el "Ver / ClassWizard" menú o el "Ctrl + W" combinación de teclas, en el "MFC ClasWizard" En el cuadro de diálogo, seleccione la pestaña "Variables del miembro". Haga clic en la línea IDC_OUTPUT, haga clic en el "Añadir variable ..." botón e ingrese el nombre de la variable "m_txtOutput" con el tipo es CString.

Repita los pasos anteriores para crear una variable llamada "m_txtInput" para "IDC_INPUT". Finalmente, crea una variable llamada "m_comm" para IDC MSCOMM1. Haga clic en Aceptar para cerrar el cuadro de diálogo Asistente para clases de MFC. De ahora en adelante, solo necesitamos recordar las 3 variables. "m_txtOutput", "m_txtInput", "m_comm" cuando queremos acceder a los cuadros de edición y MSComm mientras escribimos el código.

Escribe un codigo:

Presione Ctrl + W para volver a abrir ClassWizard, esta vez elige los "Mapas de mensajes" pestaña, en el "Nombre de la clase" caja asegurar que "CAVR_PCDlg" está seleccionado. En IDS de objeto, seleccione "CAVR_PCDlg" Mensajes" encontrar y seleccionar "WM_INITDIALOGS" luego haga clic "Editar código".

Ahora puedes escribir código para el "OnInitDilaog ()" evento, que es un evento que ocurre cuando se ejecuta el programa y se inicia el diálogo principal. Así que estableceremos los parámetros para m_comm aquí (m_comm es el nombre de la variable que representa a IDC_MSCOMM1 control que creamos en los pasos anteriores). Agregue las siguientes líneas después de "// TODO: Añadir inicialización extra aquí" línea:

Estas cinco líneas de código corresponden a las cinco líneas en el Form_Load () Sección de tEl proyecto de VB que hemos cubierto anteriormente, por lo que no necesito desarrollar estas líneas de código.

Form_Load

A continuación escribiremos el código para la onComm evento del control MSComm, antes de escribir el código presione Ctrl + W para mostrar el cuadro de diálogo ClassWizard y realizar los seis pasos para agregar el evento onComm al proyecto.

Escriba el código sa en el onComm evento:

onComm

Como se mencionó anteriormente, m_comm es una variable que representa a MSComm. El manejo de los puertos COM ahora se realiza a través de la variable m_comm. En la línea 4 declaramos una sub variable strInput del tipo CString que contiene el valor de este último. Al igual que en VB, el evento onComm puede ocurrir por muchas razones.

Solo nos preocupamos por el caso donde hay datos para almacenar en búfer, la línea 5 permite filtrar el evento: Si (m_comm. GetCommEvent () == 2). En la línea 6 declaramos una sub variable llamada in_dat con el COleVariant tipo . COleVariant Es la clase de MFC, su nombre es una combinación de C + OLE + VARIANTE en el que OLE es "Vinculación de objetos incrustados" Es un tipo de objeto que no está disponible que está incrustado, MSComm es un tipo OLE.

VARIANTE es un tipo de variable desconocida. Cuando tienes un x ​​variable, a veces desea asignar un valor numérico a x, pero a veces desea asignar una cadena x. Entonces declara x es VARIANTE. En el caso de MSComm, los datos de entrada y salida de este objeto son "desconocidos" o "VARIANTE".

En la línea 7 simplemente obtenemos el valor de m_comm en la variable in_dat: in_dat = m_comm.GetInput(). En la siguiente línea "extraemos" el elemento de cadena de la variable in_dat y asignarle la variable strInput: strInput = in_dat.bstrVal (de manera relativa, puede cambiar in_dat a CString y asignarlo a strInput).

Tenemos que extraer CString porque el cuadro de edición solo muestra CString. Para visualizar los datos recibidos en el cuadro Editar. ( IDC_OUTPUT ) incrementamos la variable m_txtOutput (representado por el cuadro de edición IDC_OUTPUT ) con la línea 9: m_txtOutput + = strInput. Finalmente, para que el valor de la m_txtOutput variable para actualizar al cuadro Editar debemos llamar a la función UpdateData con el parámetro FALSE como línea 10: UpdateData (FALSE) (Así es como funciona Visual C ++.).

Las líneas del 12 al 14 se utilizan para colocar el cursor al final de la línea del cuadro Editar después del final del proceso de recepción de datos. Puedes ignorarlo si no es necesario.

Finalmente, escriba el código para el cuadro de edición a continuación (IDC_INPUT) de modo que cuando escribamos, el carácter será enviado al puerto COM. Prensa Ctrl + W y realice los pasos a continuación para agregar a la onChange evento.

Add an onChange event for IDC_INPUT
Figure 7.

Escriba el siguiente código en la entrada del cuadro de edición onChange evento:

onChange

Cuando el usuario escribe un carácter en el cuadro Editar, el onChange evento ocurre. Luego extraemos el último carácter en el texto del cuadro Editar que representa la variable m_txtInput con la línea de comandos 11: tmpStr = m_txtInput.Right (1).

Dónde tmpStr es una variable temporal declarada en la línea 9. Tenga en cuenta que es importante leer el contenido del cuadro Editar. Necesitamos llamar UpdateData con el anterior TRUE Parámetro como en la línea 10. Finalmente, llame al método. SetOutput del objeto MSComm para enviar el valor del puerto COM: m_comm.SetOutput (COleVariant (tmpStr)).

Para enviar un carácter (o cadena de caracteres) al puerto COM, primero debemos "lanzar" el carácter a COleVariant porque como se muestra, MSComm solo funciona con COleVariant. Párrafo COleVariant (tmpStr) Haz esto.

Después de escribir el código para el evento onChange, puede presionar Ctrl + F5 para ejecutar el programa. Utilizar el AVR_STD_Terminal. DSN circula y ejecuta la simulación como en la programación con VB. El resultado se muestra en la Figura 8..

Comunicación entre AVR y Visual C ++
Figura 8.

Virtual Serial Port Driver

Requisitos: Windows (32 bits y 64 bits): XP(solamente Standard)/2003(solamente Standard)/2008/ Vista/7/8/10, Windows Server 2012, Windows Server 2016 , 5.5MB tamaño
versión 9.0.575 (23rd May, 2019) Notas de la versión
Categoría: Communication Application