Comunicaciones seriales con visual C# 2010

57
Autor: Andrés Gerardo Fuentes Covarrubias 1 Comunicaciones seriales Caso: Visual C# 2010 Express PIC18F4550 - CCS – PICC M.C. ANDRÉS GERARDO FUENTES COVARRUBIAS Materia: Sistemas Embebidos y Control – SEPTIMO SEMESTRE Ingeniero en Sistemas Computacionales Universidad de Colima Facultad de Ingeniería Mecánica y Eléctrica Academia de Arquitectura de Computadoras

description

Diapositivas de la guia didáctica para desarrollar aplicaciones de comunicaciones seriales con Microsoft visual C# 2010 Express y el Microcontrolador PIC18f4550 con el compilador CCS, graficado con el control ZedGraph.

Transcript of Comunicaciones seriales con visual C# 2010

Page 1: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 1

Comunicaciones seriales

Caso: Visual C# 2010 ExpressPIC18F4550 - CCS – PICC

M.C. ANDRÉS GERARDO FUENTES COVARRUBIAS

Materia: Sistemas Embebidos y Control – SEPTIMO SEMESTREIngeniero en Sistemas Computacionales

Universidad de ColimaFacultad de Ingeniería Mecánica y EléctricaAcademia de Arquitectura de Computadoras

Page 2: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 2

Metodología

� Creación de una nueva aplicación� Instalación de Virtual Serial Port� toolStrip y componentes básicos� Manejo de los puertos seriales� Apertura de un puerto� Transmisión� Recepción

Page 3: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 3

Virtual Serial Port

� Forma comoda de depurar las aplicaciones al crear puertos seriales virtuales pareados

� Un puerto serial para la simulación en ISIS Proteus

� Un puerto serial para el programa en Visual C# 2010

Page 4: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 4

Creación de una nueva aplicación

Abrir VC# 2010 y elegir“Archivo”->”Nuevo Projecto”

Después “Aplicación de Windows Forms y el botón “Aceptar”después de darle nombre al nuevo proyecto

Page 5: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 5

Manejo de los puertos seriales• Elegir dos controles:

1. Para manejo de los puertos seriales: “SerialPort”, será el encargado de manejar todas las propiedades, métodos y eventos relacionados con el puerto o los puertos seriales de la aplicación, crear tantos como puertos seriales se necesite.

• Elegir dos controles:

2. Para manejo de los controles básicos de las comunicaciones seriales, asi como mensajes e indicadores, elija el control “ToolStrip”

Estos controles no son visibles en la forma principal, por lo tanto se colocan en el “Status Strip”

Page 6: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 6

Manejo de puertos serialesControles en la aplicación, ToolStrip.

Observe que para .Net el control para puerto serial contiene todas las propiedades para las características de la trama en tiempo de diseño

ComboBox

TextBox Boton Label

Page 7: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 7

Manejo de puertos serialesControles en la aplicación, área de trabajo

TabControl

OvalShape

Botones

Label

Page 8: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 8

Código fuente inicial

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using System.IO.Ports;using System.Threading;using Microsoft.VisualBasic.PowerPacks;

namespace consolaSerialCDC{

public partial class Form1 : Form{

public Form1(){

InitializeComponent();}

private void Form1_Load(object sender, EventArgs e){

}

}

El código fuente inicial solo describe las librerías a ser utilizadas al momento y el esqueleto inicial para el “namespace” correspondiente a nuestra aplicación.

Agregar estas referenciasexternas

Page 9: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 9

Manejo de los puertos seriales

if(!serialPort1.IsOpen){

try{

serialPort1.Open();}catch (System.Exception ex){

MessageBox.Show(ex.ToString());}

}

La apertura de un puerto serial en Visual C# es tan sencillo como agregar el siguiente código al botón “Conectar” del ToolStrip:

Las propiedades del control SerialPort se pueden establecer en tiempo de diseño mediante el cuadro de propiedades.

Page 10: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 10

Apertura de un puerto

serialPort1.BaudRate = 9600; // Velocidad de transmisiónserialPort1.Parity = Parity.None; //Tipo de paridadserialPort1.DataBits = 8; //Número de bits de datosserialPort1.StopBits = StopBits.One; //Número de bits de paradaserialPort1.PortName = toolStripTextBox1.Text; //Use el control adecuado para el usuarioserialPort1.Open(); //Abrir el puerto

Siempre se puede abrir un puerto con el código siguiente y tambien establecer las caracteristicas de la trama:

Vincule el código anterior con un botón y podrá abrir el puerto serial capturado en el control “toolStripTextBox1” al presionar el botón “Conectar”

Page 11: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 11

Transmisión •Siempre que haya un puerto serial abierto se puede enviar datos por ese puerto.

•En el TabControl “Terminal”

•Agregue dos controles

•TextBox

•Botón

private void button1_Click(object sender, EventArgs e){

if (conectado == true){

if (tbTerminalEnviar.Text.Length > 0){

serialPort1.WriteLine("@" + tbTerminalEnviar.Text + "\r");}else{

MessageBox.Show("MENSAJE VACIO");}

}else{

MessageBox.Show("Puerto Serial NO CONECTADO");}

}

Agregue el código del botón

Page 12: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 12

Transmisión

byte[] miBuffer= new byte[1];

miBuffer[0] = 0x62; //Carácter a enviar por el puerto.SP1.Write(miBuffer, 0, miBuffer.Length);

Siempre es posible enviar también un solo caracter por el puerto serial:

// Enviar tramabyte[] miBuffer= new byte[3]; // Tres caracteres máximo.

miBuffer[0] = 0x74;miBuffer[1] = 0x54;miBuffer[2] = 0x13;

SP1.Write(miBuffer, 0, miBuffer.Length);

Por ejemplo, si lo que se desea es enviar una trama completa, entonces:

Page 13: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 13

TransmisiónTambien se puede vincular código a otros controles de usuario:

strBufferOut = "1"; //Buffer de transmisiónserialPort1.DiscardOutBuffer(); //Limpiamos el buffer de transmisiónserialPort1.Write(strBufferOut); //Enviar caracteres

Cada control incluye código:

Indicadores con el control Ovalshape para simular leds.

Salidas por botón

Page 14: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 14

Recepción

� El proceso de recepción de datos es un proceso un poco mas complejo, ya que es necesario instalar el vector de interrupción del evento “DataReceived”y crear un nuevo Thread (hilo) que atienda al manejador de ese evento.

Page 15: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 15

RecepciónCrear un nuevo control TextBox, que sea multilinea, con ScrollBar vertical y ajustado a la parte inferior del formulario. Este control va a operar como nuestra consola del usuario, para desplegar mensajes de la aplicación, los datos enviados y los recibidos.

Page 16: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 16

Recepción

1. Codigo de al cargar el formulario:

public Form1(){

txtRecibidos.Text = "";strBufferIn = "";serialPort1.DataReceived += new SerialDataReceivedEventHandler(

serialPort1_DataReceived);}

Para crear un manejador, se debe agregar un nuevo manejador de eventos, y vincularlo con el método apropiado del control “serialPort”, el procedimiento consta de tres pasos:

Page 17: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 17

Recepción2. El codigo del manejador de eventos

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){

strBufferIn = "";

//Debemos hacer una pausa, para que el buffer se llene por completo//y pueda cargar todos los datos.//Si esta pausa no se realiza, no carga las lineas por completo y solo//nos muestra parte del mensaje enviado.

Thread.Sleep(250);strBufferIn += serialPort1.ReadExisting();if (serialPort1.BytesToRead > 0)

strBufferIn += serialPort1.ReadExisting();

String Linea;Linea = strBufferIn; //Guardamos la cadena original para "Split"

//Posterior

this.Invoke(new EventHandler(Actualiza_textbox));}

Page 18: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 18

Recepción

2. El codigo del “delegado”

private void Actualiza_textbox(object s, EventArgs e){

txtRecibidos.Text += strBufferIn + "\r\n";}

Page 19: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 19

Status StripSiempre es posible manejar la barra de estado de nuestro formulario:

•Barra de estado

•Menú de opciones

Page 20: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 20

Status strip

Agregue un control “timer”

Para agregar el reloj del sistema a la barra de estado:

Configure las propiedades

Page 21: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 21

Status strip� Ejecute los siguientes pasos en el orden indicado:

Agregar el código al control del timer:

private void timer1_Tick(object sender, EventArgs e){

statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();}

1 2 3

Cambie la propiedad“Text” a “hh:mm:ss”

Page 22: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 22

Caso de estudio

� Interfaz serial RS232C Max232� Circuito LM35z a °C� Registrador de temperaturas� Graficador de 2 canales� Base de datos sqlServer

Page 23: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 23

ESQUEMATICO VERSION 1

Page 24: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 24

Controles para el modelado en Proteus ISIS

� ComPim: Para salida de datos por medio de un Virtual Port

� Monitoreo por medio de la Terminal Virtual

Page 25: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 25

LoopBack serial Isis Proteus� Interconecta por “cable

cruzado” la terminal virtual y el control ComPim

� Por medio de un programa de hiperterminal se puede monitorear la actividad serial RS232C

� No se necesita convertidor de protocolo MAX232

Page 26: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 26

Modelo de programación del microcontrolador PIC18F4550 para comunicaciones seriales

� Comunicaciones Full-Duplex� Compatibilidad 9600, 8 , N, 1� Programable en ensamblador y lenguaje de alto nivel

� BaudRate totalmente configurable� Capaz de manejar e identificar paridad

Page 27: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 27

Pinout del Pic18F4550

Page 28: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 28

Comunicaciones en CCS� La inicialización de interfases seriales, tanto Hardware como Software

se llevan a cabo por medio de la instrucción:

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)

� La salida de datos y caracteres ahora pueden llevarse a cabo pormedio de la instrucción printf(), respetando todos los formatos de dicha instrucción.

� Tambien se puede usar la instrucción putchar() para sacar un carácter individual en cualquier momento

� La lectura de caracteres se puede llevar a cabo por medio de la instrucción getchar()

Page 29: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 29

Ejemplo de salida de datos

Page 30: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 30

Codigo de salida de datoslcd_putc("Terminal Serial ");printf("Terminal Serial %c%c",13,10);while(1) // Ciclo infinito{

lcd_gotoxy(1,2); // Posicionamos cursor renglon 2printf(lcd_putc,"%u",a); // Desplegar el valor de aprintf("%u %c %c",a,13,10); // Sacamos por el puerto serial + CrLfoutput_bit(LED,1); // Encendemos el Leddelay_ms(500); // Retardo de 500 milisegundos prendidooutput_bit(LED,0); // Apagamos el Leddelay_ms(500); // Retardo de 500 milisegundos apagadoa++; // Incrementamos en 1 la variableif(input(Boton)==0) // Se presiono el Boton?{

delay_ms(100); // Retardo para quitar el reboteif(input(Boton)==0) // Todavia esta presionado? procesar{

lcd_gotoxy(1,1); // Posicionamos cursos renglon 1printf(lcd_putc,"Presiono Boton"); // Desplegamos el mensajewhile(input(Boton)==0); // Ahi esperamos hasta que se suelte el Botonoutput_bit(LED,0); // Apagamos el Ledlcd_putc('\f'); // Borramos la pantallaa=0; // Limpiamos la variable

}printf(lcd_putc,"Hola Mundo");// Dejamos el LCD como estaba antes del Boton

}if(valor=="1")

output_toggle(LED1);}

Page 31: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 31

Entrada de datos en CCS

� Recomendable usar interrupciones para el puerto serial

� Por cada carácter recibido, meterlo a un buffer y procesar cuando sea necesario

Page 32: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 32

Ejemplo de entrada de datos• Monitorear por medio de Terminal Virtual.

• Entrada de datos por medio del control ComPim

Page 33: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 33

Ejemplo de entrada de datos

� Consulte el código siguiente, para recepción de datos por medio del método de polling:

E:\Documents and Settings\fuentesg\Mis d

Page 34: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 34

Tipos de interrupciones en CCS#INT_xxx - Indica que la función que le sigue (en el código fuente CCS) es una

función de interrupción. Estas funciones no deben tener parámetros. Por supuesto, no todos los PICs soportan todas las directivas disponibles:

� INT_AD Conversión A/D finalizada. � I NT_ADOF Conversión A/D timeout. � INT_BUSCOL Colisión en bus. � INT_BUTTON Pushbutton. � INT_CCP1 Unidad CCP1. � INT_CCP2 Unidad CCP2. � INT_COMP Comparador. � INT_EEPROM Escritura finalizada. � INT_EXT Interrupción externa. � INT_EXT1 Interrupción externa #1. � INT_EXT2 Interrupción externa #2. � INT_I2C Interrupción por I2C. � INT_LCD Actividad en el LCD.

� INT_LOWVOLT Bajo voltaje detectado. � INT_PSP Ingreso de datos en el Parallel

Slave Port. � INT_RB Cambios en el port B (B4-B7). � INT_RC Cambios en el port C (C4-C7). � INT_RDA Datos disponibles en RS-232. � INT_RTCC Desbordamiento del Timer 0

(RTCC). � INT_SSP Actividad en SPI o I2C. � INT_TBE Buffer de transmisión RS-232

vacío. � INT_TIMER0 Desbordamiento del Timer 0

(RTCC). � INT_TIMER1 Desbordamiento del Timer 1. � INT_TIMER2 Desbordamiento del Timer 2. � INT_TIMER3 Desbordamiento del Timer 3.

Page 35: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 35

Las interrupciones por el puerto serie

� Cada que llega un carácter al puerto serie por medio de la linea [RC7/RX/DT/SDO (26)] el microcontrolador, mediante la lógica de interrupciones, transfiere el control del flujo del programa a la primera instrucción despues de la etiqueta #int_rda

� Por medio de las interrupciones no es necesario sondear en la función main() el estado de la linea de recepción de datos seriales.

Page 36: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 36

Código de la rutina de servicio a interrupción (ISR)#int_rda //Rutina de servicio a interrupcionvoid serial_isr(){

valor=getchar(); //Leer el carácter recibido del buffer//de recepcion

}

• Activar la recepción de interrupciones globales y por el puerto serial:

//------------------------------------------------------------------------------------------------//Inicialización del microcontrolador//-----------------------------------enable_interrupts(global); //Habilitar las interrupciones globales

enable_interrupts(int_rda); //Habilitar la interrupcion por recepcion//de caracteres en el puerto serial

setup_adc_ports(NO_ANALOGS); //Las entradas analogicas configuradas como digitalesset_tris_b(0); //Todas salidas puerto Bset_tris_d(0b00000001); //RD0 salida de led de estado

output_b(0); //Apagamos todos los leds

Page 37: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 37

Ejemplo de entrada de datos

� Consulte el código siguiente, para recepción de datos por medio del método de interrupción: E:\Documents and

Settings\fuentesg\Mis d

Page 38: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 38

Principales mandatos para manejar el puerto serial CCS� Inicialización del puerto serial

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)

� Recepción de datosc = GETC() //Todas son equivalentes y básicamente esperan por un carácterc = GETCH() // a ser recibido por la patilla RC6/RX del puerto serialc = GETCHAR()

Ejemplo:

printf("Continuar (s,n)?");do {

respuesta=getch();} while(respuesta!='s'&& respuesta!='n');

GETS(char *string) //Esta función lee caracteres (usando GETC()) de la cadena (string) //hasta que encuentra un retorno de carro(valor ASCII 13). La cadena //se termina con un 0.

Page 39: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 39

Principales mandatos para manejar el puerto serial CCS� KBHIT()

Esta función devuelve TRUE si el bit que se está enviando al pin RCV de un dispositivo RS232, es el bit de inicio de un carácter. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta función para que el compilador pueda determinar la velocidad en baudios y la patilla utilizada.

Ejemplo:

keypress=' ';while ( keypress!='Q' ) //Entramos al bucle while{

if ( kbhit () )keypress=getc(); //En la variable keypress se guardan los

//caracteresif (keypress==‘1’) //Inicio del envío de un byteoutput_high(PIN_B3);

elseoutput_low(PIN_B3)

}

Page 40: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 40

Principales mandatos para manejar el puerto serial CCS� Transmisión serial

PUTC() //Ambas instrucciones son equivalentes, basicamente

PUTCHAR() //envían un carácter a la patilla XMIT(RC7/TX) de//del dispositivo RS232 del microcontrolador.

Ejemplo:

if (checksum==0)putchar(ACK);

elseputchar(NAK); // NAK carácter de respuesta negativa

PUTS(string) //Esta función envía cada carácter de string a la //patilla XMIT del dispositivo RS232. Una//vez concluido el envío de todos los caracteres la //función envía un retorno de carro CR o RETURN (ASCII 13) //y un avance de línea LF o LINE-FEED (ASCII 10).

Ejemplo: puts( " | HOLA |" );

Page 41: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 41

Principales mandatos para manejar el puerto serial CCS� Función printf() y modificadores

La función de impresión formateada printf() saca una cadena de caracteres al puerto serie RS-232 (previamente inicializado mediante #use rs232…), o a una función especificada (por ejemplo lcd_putc()). El formato está relacionado con el argumento que ponemos dentro de la cadena (string).

Sintaxis: printf([function], string, [values])

Los modificadores de formato se incluyen dentro de “string” e inician con el carácter %, opcionalmente se puede redirigir la salida de printf() hacia una función de manejo de flujo de caracteres como lcd_putc() que envia flujo de caracteres hacia un lcd alfanumérico o gráfico.

Ejemplos:

byte x,y,z;

printf (" Hola ");printf("RTCCValue=>%2x\n\r",get_rtcc());printf("%2u %X %4X\n\r",x,y,z);printf(lcd_putc, "n=%c",n);

Page 42: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 42

Manejo del buffer de recepción en Visual C#

� Control mas efectivo sobre los caracteres delimitadores

� Posibilidad de hacer parsing en línea

Page 43: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 43

Manejo del buffer de recepción (código)

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{recibidos = "";carSerial = (char) 0;while(carSerial!=';'){

carSerial = (char) serialPort1.ReadChar();if (carSerial == ';')

break;recibidos += carSerial.ToString();

}this.Invoke(new EventHandler(Actualiza_textbox));

}

Page 44: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 44

Split Tokens en C#

� Use un delimitador de campo, por lo general es el caracter “,”

� Use un delimitador de cadena, por lo general es el caracter “;”

� Use el método Split� Procese los tokens encontrados

Page 45: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 45

Códigopublic Form1(){

InitializeComponent();}

private void btSplit_Click(objectsender, EventArgs e)

{str = txtCadena.Text;string[] parts = str.Split(seps);for (int i = 0; i < parts.Length; i++)

cadenaSplit +=parts[i]+"\r\n";txtConsola.Text = cadenaSplit;

}}

}

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;

namespace splitCampos{

public partial class Form1 : Form{

string str;char[] seps={','};string cadenaSplit;

Page 46: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 46

Manejo del buffer de recepción (código para separar tokens)

private void Actualiza_textbox(object s, EventArgs e){

string[] parts = recibidos.Split(seps); //Tokenizamos la trama

if (parts.Length == 3) //Validamos numero de //tokens encontrdos, deben ser 3

{lblTemp.Text = parts[1]; //Actualizamos etiquetaslblVolt.Text = parts[2];

}lblRecibido.Text = recibidos; //Visualizamos trama actualtxtRecibidos.Text += recibidos+"\r\n"; //Actualizamos el textBox consola

}

Page 47: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 47

Principales mandatos para manejar el puerto serial� 'Definir las características de la comunicación

Serie.BaudRate = 19200 'Fijar velocidad de comunicacionesSerie.DataBits = 8 'Longitud en bits para Byte de datosSerie.Parity = Parity.Even 'Asignar paridad(enumeration parity)Serie.StopBits = StopBits.Two 'Bits parada después byte de datos

� 'Abrir/Control/Liberar PuertoSerie.Open() 'Abrir el puerto SerieSerie.Close() 'Cerrar el Puerto SerieSerie.Dispose() 'Liberar objeto

Dim SiNo As IntegerSiNo = Serie.IsOpen 'El Puerto esta abierto?

Dim Puerto As StringPuerto = Serie.PortName 'Nombre del puerto

Page 48: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 48

Principales mandatos para manejar el puerto serial

� 'Manejo y Control de señalesDim Estado As Boolean 'True=Activa / False=Inactiva

Estado = Serie.CDHolding 'Estado de la señal carrier detectEstado = Serie.CtsHolding 'Señal Clear to SendEstado = Serie.DsrHolding 'Señal Data Set ReadySerie.DtrEnable = True 'Activar de Data Terminal ReadySerie.RtsEnable = True 'Activar Request To Send

� 'Control Transmission/RecepcionSerie.ReadBufferSize = 1024 'Dimensionar tamaño buffer recepciónSerie.WriteBufferSize = 1024 'Dimensionar tamaño buffer envíoSerie.ReadTimeout = 10 'Fuera de tiempo para las lecturasSerie.WriteTimeout = 10 'Fuera de tiempo para las escriturasSerie.Handshake = Handshake.XOnXOff 'Tipo control para recepción/envíoSerie.DiscardInBuffer() 'Borrar el buffer de entradaSerie.DiscardOutBuffer() 'Borrar el buffer de salida

Page 49: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 49

Principales mandatos para manejar el puerto serial Visual C#

� 'Enviar datosContador = Serie.BytesToWrite 'Bytes en espera de ser escritosSerie.Write("Hola Mundo") 'Enviar una cadena de caracteresSerie.WriteLine("Hola Mundo") 'Enviar una línea

� 'Leer datosContador = Serie.BytesToRead 'Bytes en espera de ser leídosSerie.ReadByte() 'Leer un byteSerie.ReadChar() 'Leer un charSerie.ReadLine() 'Leer una líneaSerie.ReadExisting() 'Leer los datos existentes en buffer

Page 50: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 50

Uso de ZedGraph

� ZedGraph es uno de los controles mas utilizados en ingeniería para desplegar gráficos de puntos o líneas.

� Como es un control externo es necesario instalarlo como un componente adicional.

Page 51: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 51

Uso de ZedGraph

� La primera parte consiste en su inicialización

� La segunda parte ocurre tambien en tiempo de ejecución y consiste en la impresión de los puntos recibidos y unirlos mediante lineas.

Page 52: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 52

1. Creación del control:

Page 53: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 53

2. Inicialización

� Consiste en la inicialización del control

� Generalmente se efectua al cargar la forma principal por primera vez

� Se puede usar una función de usuario

1. Definir un objeto tipo lista:PointPairList list1 = new PointPairList();

2. Crear la función de usuario:private void inicializaGrafico(ZedGraphControl zgc){

GraphPane myPane = zgc.GraphPane;// TitulosmyPane.Title.Text = "Gráfico de temperaturas";myPane.XAxis.Title.Text = "Muestra";myPane.YAxis.Title.Text = "Temperatura";myPane.YAxis.Scale.Max = 150;

// Inicializa una curva con diamantes en cada muestra// la palabra "temperatura" como titulo de la muestra

LineItem myCurve = myPane.AddCurve("Temperatura",list1, Color.Red,SymbolType.None);

}

3. Inicializarla dentro de Form_Load14. No olvidar referenciar el NameSpace ZedGraph con el

Using correspondiente

Page 54: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 54

3. Código del usuarioprivate void Form1_Load(object sender, EventArgs e){

UpdateSerialPorts(); inicializaGrafico(graficoTemp);

}

private void inicializaGrafico(ZedGraphControl zgc){

GraphPane myPane = zgc.GraphPane;

// TitulosmyPane.Title.Text = "Gráfico de temperaturas";myPane.XAxis.Title.Text = "Muestra";myPane.YAxis.Title.Text = "Temperatura";myPane.YAxis.Scale.Max = 150;

// Inicializa una curva con diamantes en cada muestra tomada// la palabra "temperatura" como titulo de la muestra

LineItem myCurve = myPane.AddCurve("Temperatura", list1, Color.Red, SymbolType.None);

}

Page 55: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 55

4. Función de recepción con Split campos

� La recepción debe cambiar ya que tradicionalmente se procesa el buffer de recepción en conjunto.

� Ahora deberá procesarse carácter a carácter hasta obtener un carácter de fin de trama = “;”

� Despues de recibir el fin de trama deberásepararse los campos con el método Split

Page 56: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 56

private void Actualiza_textbox(object s, EventArgs e){

string[] parts = strBufferIn.Split(seps);

if (parts.Length == 3){

lblTemp.Text = parts[1];temperaturaCanal1 = Convert.ToSingle(parts[1]);numMuestra++;float x = (float)numMuestra;float y = (float)temperaturaCanal1;list1.Add(x, y);graficoTemp.AxisChange();graficoTemp.Refresh();lblVolt.Text = parts[2];

}

txtConsola.Text += strBufferIn + "\r\n";}

Page 57: Comunicaciones seriales con visual C# 2010

Autor: Andrés Gerardo Fuentes Covarrubias 57

RESOLUCIÓN DE DUDAS

[email protected][email protected][email protected]� Facebook: /Andres.FuentesCovarrubias