You are on page 1of 57

Materia: Sistemas Embebidos y Control SEPTIMO SEMESTRE Ingeniero en Sistemas Computacionales Universidad de Colima Facultad de Ingeniera Mecnica y Elctrica

a Academia de Arquitectura de Computadoras

Comunicaciones seriales
Caso: Visual C# 2010 Express
PIC18F4550 CCS PICC M.C. ANDRS GERARDO FUENTES COVARRUBIAS

Autor: Andrs Gerardo Fuentes Covarrubias

Metodologa
Creacin de una nueva aplicacin Instalacin de Virtual Serial Port toolStrip y componentes bsicos Manejo de los puertos seriales Apertura de un puerto Transmisin Recepcin
Autor: Andrs Gerardo Fuentes Covarrubias 2

Virtual Serial Port


Forma comoda de depurar las aplicaciones al crear puertos seriales virtuales pareados Un puerto serial para la simulacin en ISIS Proteus Un puerto serial para el programa en Visual C# 2010
Autor: Andrs Gerardo Fuentes Covarrubias 3

Creacin de una nueva aplicacin

Abrir VC# 2010 y elegir Archivo->Nuevo Projecto

Despus Aplicacin de Windows Forms y el botn Aceptar despus de darle nombre al nuevo proyecto

Autor: Andrs Gerardo Fuentes Covarrubias

Manejo de los puertos seriales


1. Elegir dos controles: Para manejo de los puertos seriales: SerialPort, ser el encargado de manejar todas las propiedades, mtodos y eventos relacionados con el puerto o los puertos seriales de la aplicacin, crear tantos como puertos seriales se necesite.

2.

Elegir dos controles: Para manejo de los controles bsicos 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

Autor: Andrs Gerardo Fuentes Covarrubias

Manejo de puertos seriales


Controles en la aplicacin, ToolStrip.
ComboBox TextBox Boton Label

Observe que para .Net el control para puerto serial contiene todas las propiedades para las caractersticas de la trama en tiempo de diseo Autor: Andrs Gerardo Fuentes Covarrubias

Manejo de puertos seriales


Controles en la aplicacin, rea de trabajo
TabControl

OvalShape Label

Botones

Autor: Andrs Gerardo Fuentes Covarrubias

Cdigo fuente inicial


El cdigo fuente inicial solo describe las libreras a ser utilizadas al momento y el esqueleto inicial para el namespace correspondiente a nuestra aplicacin.
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) { } }

Agregar estas referencias externas

Autor: Andrs Gerardo Fuentes Covarrubias

Manejo de los puertos seriales


La apertura de un puerto serial en Visual C# es tan sencillo como agregar el siguiente cdigo al botn Conectar del ToolStrip: if(!serialPort1.IsOpen) { try { serialPort1.Open(); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } }

Las propiedades del control SerialPort se pueden establecer en tiempo de diseo mediante el cuadro de propiedades.

Autor: Andrs Gerardo Fuentes Covarrubias

Apertura de un puerto
Siempre se puede abrir un puerto con el cdigo siguiente y tambien establecer las caracteristicas de la trama: serialPort1.BaudRate = 9600; serialPort1.Parity = Parity.None; serialPort1.DataBits = 8; serialPort1.StopBits = StopBits.One; serialPort1.PortName = toolStripTextBox1.Text; serialPort1.Open(); // Velocidad de transmisin //Tipo de paridad //Nmero de bits de datos //Nmero de bits de parada //Use el control adecuado para el usuario //Abrir el puerto

Vincule el cdigo anterior con un botn y podr abrir el puerto serial capturado en el control toolStripTextBox1 al presionar el botn Conectar

Autor: Andrs Gerardo Fuentes Covarrubias

10

Transmisin

Siempre que haya un puerto serial abierto se puede enviar datos por ese puerto. En el TabControl Terminal Agregue dos controles TextBox Botn

Agregue el cdigo del botn


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"); } } Autor: Andrs Gerardo

Fuentes 11

Covarrubias

Transmisin
Siempre es posible enviar tambin un solo caracter por el puerto serial:
byte[] miBuffer= new byte[1];

miBuffer[0] = 0x62; SP1.Write(miBuffer, 0, miBuffer.Length);

//Carcter a enviar por el puerto.

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


// Enviar trama byte[] miBuffer= new byte[3]; miBuffer[0] = 0x74; miBuffer[1] = 0x54; miBuffer[2] = 0x13; SP1.Write(miBuffer, 0, miBuffer.Length); Autor: Andrs Gerardo Fuentes Covarrubias 12 // Tres caracteres mximo.

Transmisin
Tambien se puede vincular cdigo a otros controles de usuario:

Indicadores con el control Ovalshape para simular leds.

Salidas por botn

Cada control incluye cdigo: strBufferOut = "1"; serialPort1.DiscardOutBuffer(); serialPort1.Write(strBufferOut); //Buffer de transmisin //Limpiamos el buffer de transmisin //Enviar caracteres
Autor: Andrs Gerardo Fuentes Covarrubias

13

Recepcin
El proceso de recepcin de datos es un proceso un poco mas complejo, ya que es necesario instalar el vector de interrupcin del evento DataReceived y crear un nuevo Thread (hilo) que atienda al manejador de ese evento.

Autor: Andrs Gerardo Fuentes Covarrubias

14

Recepcin
Crear 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 aplicacin, los datos enviados y los recibidos.

Autor: Andrs Gerardo Fuentes Covarrubias

15

Recepcin
Para crear un manejador, se debe agregar un nuevo manejador de eventos, y vincularlo con el mtodo apropiado del control serialPort, el procedimiento consta de tres pasos:

1. Codigo de al cargar el formulario: public Form1() { txtRecibidos.Text = ""; strBufferIn = ""; serialPort1.DataReceived += new SerialDataReceivedEventHandler( serialPort1_DataReceived); }

Autor: Andrs Gerardo Fuentes Covarrubias

16

Recepcin
2. 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)); } Autor: Andrs Gerardo Fuentes Covarrubias 17

Recepcin
2. El codigo del delegado private void Actualiza_textbox(object s, EventArgs e) { txtRecibidos.Text += strBufferIn + "\r\n"; }

Autor: Andrs Gerardo Fuentes Covarrubias

18

Status Strip
Siempre es posible manejar la barra de estado de nuestro formulario:

Barra de estado Men de opciones

Autor: Andrs Gerardo Fuentes Covarrubias

19

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

Agregue un control timer

Configure las propiedades

Autor: Andrs Gerardo Fuentes Covarrubias

20

Status strip
Ejecute los siguientes pasos en el orden indicado: 1 2
Cambie la propiedad Text a hh:mm:ss

Agregar el cdigo al control del timer:


private void timer1_Tick(object sender, EventArgs e) { statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString(); }

Autor: Andrs Gerardo Fuentes Covarrubias

21

Caso de estudio
Interfaz serial RS232C Max232 Circuito LM35z a C Registrador de temperaturas Graficador de 2 canales Base de datos sqlServer
Autor: Andrs Gerardo Fuentes Covarrubias 22

ESQUEMATICO VERSION 1

Autor: Andrs Gerardo Fuentes Covarrubias

23

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

Autor: Andrs Gerardo Fuentes Covarrubias

24

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
Autor: Andrs Gerardo Fuentes Covarrubias 25

Modelo de programacin 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
Autor: Andrs Gerardo Fuentes Covarrubias

26

Pinout del Pic18F4550

Autor: Andrs Gerardo Fuentes Covarrubias

27

Comunicaciones en CCS
La inicializacin de interfases seriales, tanto Hardware como Software se llevan a cabo por medio de la instruccin: #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 por medio de la instruccin printf(), respetando todos los formatos de dicha instruccin. Tambien se puede usar la instruccin putchar() para sacar un carcter individual en cualquier momento La lectura de caracteres se puede llevar a cabo por medio de la instruccin getchar()
Autor: Andrs Gerardo Fuentes Covarrubias 28

Ejemplo de salida de datos

Autor: Andrs Gerardo Fuentes Covarrubias

29

Codigo de salida de datos


lcd_putc("Terminal Serial "); printf("Terminal Serial %c%c",13,10); while(1) // Ciclo infinito { lcd_gotoxy(1,2); // Posicionamos cursor renglon 2 printf(lcd_putc,"%u",a); // Desplegar el valor de a printf("%u %c %c",a,13,10); // Sacamos por el puerto serial + CrLf output_bit(LED,1); // Encendemos el Led delay_ms(500); // Retardo de 500 milisegundos prendido output_bit(LED,0); // Apagamos el Led delay_ms(500); // Retardo de 500 milisegundos apagado a++; // Incrementamos en 1 la variable if(input(Boton)==0) // Se presiono el Boton? { delay_ms(100); // Retardo para quitar el rebote if(input(Boton)==0) // Todavia esta presionado? procesar { lcd_gotoxy(1,1); // Posicionamos cursos renglon 1 printf(lcd_putc,"Presiono Boton"); // Desplegamos el mensaje while(input(Boton)==0); // Ahi esperamos hasta que se suelte el Boton output_bit(LED,0); // Apagamos el Led lcd_putc('\f'); // Borramos la pantalla a=0; // Limpiamos la variable } printf(lcd_putc,"Hola Mundo");// Dejamos el LCD como estaba antes del Boton } if(valor=="1") output_toggle(LED1); }

Autor: Andrs Gerardo Fuentes Covarrubias

30

Entrada de datos en CCS


Recomendable usar interrupciones para el puerto serial Por cada carcter recibido, meterlo a un buffer y procesar cuando sea necesario

Autor: Andrs Gerardo Fuentes Covarrubias

31

Ejemplo de entrada de datos

Monitorear por medio de Terminal Virtual. Entrada de datos por medio del control ComPim

Autor: Andrs Gerardo Fuentes Covarrubias

32

Ejemplo de entrada de datos


Consulte el cdigo siguiente, para recepcin de datos por medio del mtodo de polling:

E:\Documents and Settings\fuentesg\Mis d

Autor: Andrs Gerardo Fuentes Covarrubias

33

Tipos de interrupciones en CCS


#INT_xxx - Indica que la funcin que le sigue (en el cdigo fuente CCS) es una funcin de interrupcin. Estas funciones no deben tener parmetros. Por supuesto, no todos los PICs soportan todas las directivas disponibles:

INT_AD Conversin A/D finalizada. I NT_ADOF Conversin A/D timeout. INT_BUSCOL Colisin en bus. INT_BUTTON Pushbutton. INT_CCP1 Unidad CCP1. INT_CCP2 Unidad CCP2. INT_COMP Comparador. INT_EEPROM Escritura finalizada. INT_EXT Interrupcin externa. INT_EXT1 Interrupcin externa #1. INT_EXT2 Interrupcin externa #2. INT_I2C Interrupcin 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 transmisin RS-232 vaco. 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.

Autor: Andrs Gerardo Fuentes Covarrubias

34

Las interrupciones por el puerto serie


Cada que llega un carcter al puerto serie por medio de la linea [RC7/RX/DT/SDO (26)] el microcontrolador, mediante la lgica de interrupciones, transfiere el control del flujo del programa a la primera instruccin despues de la etiqueta #int_rda Por medio de las interrupciones no es necesario sondear en la funcin main() el estado de la linea de recepcin de datos seriales.
Autor: Andrs Gerardo Fuentes Covarrubias

35

Cdigo de la rutina de servicio a interrupcin (ISR)


#int_rda void serial_isr() { valor=getchar(); } //Rutina de servicio a interrupcion //Leer el carcter recibido del buffer //de recepcion

Activar la recepcin de interrupciones globales y por el puerto serial:

//-----------------------------------------------------------------------------------------------//Inicializacin del microcontrolador //----------------------------------enable_interrupts(global); //Habilitar las interrupciones globales enable_interrupts(int_rda); setup_adc_ports(NO_ANALOGS); set_tris_b(0); set_tris_d(0b00000001); output_b(0); //Habilitar la interrupcion por recepcion //de caracteres en el puerto serial //Las entradas analogicas configuradas como digitales //Todas salidas puerto B //RD0 salida de led de estado //Apagamos todos los leds

Autor: Andrs Gerardo Fuentes Covarrubias

36

Ejemplo de entrada de datos


Consulte el cdigo siguiente, para recepcin de datos por medio del mtodo de interrupcin:

E:\Documents and Settings\fuentesg\Mis d

Autor: Andrs Gerardo Fuentes Covarrubias

37

Principales mandatos para manejar el puerto serial CCS


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

Recepcin de datos
c = GETC() c = GETCH() c = GETCHAR() Ejemplo: printf("Continuar (s,n)?"); do { respuesta=getch(); } while(respuesta!='s'&& respuesta!='n'); GETS(char *string) //Esta funcin 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. //Todas son equivalentes y bsicamente esperan por un carcter // a ser recibido por la patilla RC6/RX del puerto serial

Autor: Andrs Gerardo Fuentes Covarrubias

38

Principales mandatos para manejar el puerto serial CCS


KBHIT() Esta funcin devuelve TRUE si el bit que se est enviando al pin RCV de un dispositivo RS232, es el bit de inicio de un carcter. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funcin para que el compilador pueda determinar la velocidad en baudios y la patilla utilizada. Ejemplo: keypress=' '; while ( keypress!='Q' ) { if ( kbhit () ) keypress=getc(); if (keypress==1) output_high(PIN_B3); else output_low(PIN_B3) } Autor: Andrs Gerardo Fuentes Covarrubias

//Entramos al bucle while

//En la variable keypress se guardan los //caracteres //Inicio del envo de un byte

39

Principales mandatos para manejar el puerto serial CCS


Transmisin serial
PUTC() PUTCHAR() //Ambas instrucciones son equivalentes, basicamente //envan un carcter a la patilla XMIT(RC7/TX) de

//del dispositivo RS232 del microcontrolador. Ejemplo:


if (checksum==0) putchar(ACK); else putchar(NAK); PUTS(string)

// NAK carcter de respuesta negativa //Esta funcin enva cada carcter de string a la //patilla XMIT del dispositivo RS232. Una //vez concluido el envo de todos los caracteres la //funcin enva un retorno de carro CR o RETURN (ASCII 13) //y un avance de lnea LF o LINE-FEED (ASCII 10). puts( " | HOLA |" );

Ejemplo:

Autor: Andrs Gerardo Fuentes Covarrubias

40

Principales mandatos para manejar el puerto serial CCS


Funcin printf() y modificadores
La funcin de impresin formateada printf() saca una cadena de caracteres al puerto serie RS-232 (previamente inicializado mediante #use rs232), o a una funcin 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 carcter %, opcionalmente se puede redirigir la salida de printf() hacia una funcin de manejo de flujo de caracteres como lcd_putc() que envia flujo de caracteres hacia un lcd alfanumrico o grfico.

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); Autor: Andrs Gerardo Fuentes Covarrubias 41

Manejo del buffer de recepcin en Visual C#


Control mas efectivo sobre los caracteres delimitadores Posibilidad de hacer parsing en lnea

Autor: Andrs Gerardo Fuentes Covarrubias

42

Manejo del buffer de recepcin (cdigo)


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)); }
Autor: Andrs Gerardo Fuentes Covarrubias

43

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 mtodo Split Procese los tokens encontrados
Autor: Andrs Gerardo Fuentes Covarrubias

44

Cdigo
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; } public Form1() { InitializeComponent(); } private void btSplit_Click(object sender, 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; } }

Autor: Andrs Gerardo Fuentes Covarrubias

45

Manejo del buffer de recepcin (cdigo para separar tokens)


private void Actualiza_textbox(object s, EventArgs e) { string[] parts = recibidos.Split(seps); //Tokenizamos la trama if (parts.Length == 3) { lblTemp.Text = parts[1]; lblVolt.Text = parts[2]; } lblRecibido.Text = recibidos; txtRecibidos.Text += recibidos+"\r\n"; } //Actualizamos etiquetas //Validamos numero de //tokens encontrdos, deben ser 3

//Visualizamos trama actual //Actualizamos el textBox consola

Autor: Andrs Gerardo Fuentes Covarrubias

46

Principales mandatos para manejar el puerto serial


'Definir las caractersticas de la comunicacin Serie.BaudRate = 19200 'Fijar velocidad de comunicaciones Serie.DataBits = 8 'Longitud en bits para Byte de datos Serie.Parity = Parity.Even 'Asignar paridad(enumeration parity) Serie.StopBits = StopBits.Two 'Bits parada despus byte de datos 'Abrir/Control/Liberar Puerto Serie.Open() Serie.Close() Serie.Dispose() Dim SiNo As Integer SiNo = Serie.IsOpen Dim Puerto As String Puerto = Serie.PortName

'Abrir el puerto Serie 'Cerrar el Puerto Serie 'Liberar objeto

'El Puerto esta abierto?

'Nombre del puerto

Autor: Andrs Gerardo Fuentes Covarrubias

47

Principales mandatos para manejar el puerto serial


'Manejo y Control de seales
Dim Estado As Boolean Estado = Serie.CDHolding Estado = Serie.CtsHolding Estado = Serie.DsrHolding Serie.DtrEnable = True Serie.RtsEnable = True 'True=Activa / False=Inactiva 'Estado de la seal carrier detect 'Seal Clear to Send 'Seal Data Set Ready 'Activar de Data Terminal Ready 'Activar Request To Send

'Control Transmission/Recepcion
Serie.ReadBufferSize = 1024 Serie.WriteBufferSize = 1024 Serie.ReadTimeout = 10 Serie.WriteTimeout = 10 Serie.Handshake = Handshake.XOnXOff Serie.DiscardInBuffer() Serie.DiscardOutBuffer() 'Dimensionar tamao buffer recepcin 'Dimensionar tamao buffer envo 'Fuera de tiempo para las lecturas 'Fuera de tiempo para las escrituras 'Tipo control para recepcin/envo 'Borrar el buffer de entrada 'Borrar el buffer de salida

Autor: Andrs Gerardo Fuentes Covarrubias

48

Principales mandatos para manejar el puerto serial Visual C#


'Enviar datos Contador = Serie.BytesToWrite Serie.Write("Hola Mundo") Serie.WriteLine("Hola Mundo") 'Leer datos Contador = Serie.BytesToRead Serie.ReadByte() Serie.ReadChar() Serie.ReadLine() Serie.ReadExisting() 'Bytes en espera de ser escritos 'Enviar una cadena de caracteres 'Enviar una lnea

'Bytes en espera de ser ledos 'Leer un byte 'Leer un char 'Leer una lnea 'Leer los datos existentes en buffer

Autor: Andrs Gerardo Fuentes Covarrubias

49

Uso de ZedGraph
ZedGraph es uno de los controles mas utilizados en ingeniera para desplegar grficos de puntos o lneas. Como es un control externo es necesario instalarlo como un componente adicional.

Autor: Andrs Gerardo Fuentes Covarrubias

50

Uso de ZedGraph
La primera parte consiste en su inicializacin La segunda parte ocurre tambien en tiempo de ejecucin y consiste en la impresin de los puntos recibidos y unirlos mediante lineas.

Autor: Andrs Gerardo Fuentes Covarrubias

51

1. Creacin del control:

Autor: Andrs Gerardo Fuentes Covarrubias

52

1. Definir un objeto tipo lista:

2. Inicializacin
Consiste en la inicializacin del control Generalmente se efectua al cargar la forma principal por primera vez Se puede usar una funcin de usuario

PointPairList list1 = new PointPairList();

2. Crear la funcin de usuario:


private void inicializaGrafico(ZedGraphControl zgc) { GraphPane myPane = zgc.GraphPane; // Titulos myPane.Title.Text = "Grfico 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_Load1 4. No olvidar referenciar el NameSpace ZedGraph con el Using correspondiente

Autor: Andrs Gerardo Fuentes Covarrubias

53

3. Cdigo del usuario


private void Form1_Load(object sender, EventArgs e) { UpdateSerialPorts(); inicializaGrafico(graficoTemp); } private void inicializaGrafico(ZedGraphControl zgc) { GraphPane myPane = zgc.GraphPane; // Titulos myPane.Title.Text = "Grfico 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); } Autor: Andrs Gerardo Fuentes Covarrubias

54

4. Funcin de recepcin con Split campos La recepcin debe cambiar ya que tradicionalmente se procesa el buffer de recepcin en conjunto. Ahora deber procesarse carcter a carcter hasta obtener un carcter de fin de trama = ; Despues de recibir el fin de trama deber separarse los campos con el mtodo Split
Autor: Andrs Gerardo Fuentes Covarrubias 55

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"; }
Autor: Andrs Gerardo Fuentes Covarrubias 56

RESOLUCIN DE DUDAS
fuentesg@ucol.mx fuentesg85@hotmail.com fuentesg@gmail.com Facebook: /Andres.FuentesCovarrubias

Autor: Andrs Gerardo Fuentes Covarrubias

57

You might also like