Está en la página 1de 57

Autor: Andrs Gerardo Fuentes

Covarrubias 1
Comunicaciones seriales
Caso: Visual C# 2010 Express
PIC18F4550 - CCS PICC
M.C. ANDRS GERARDO FUENTES COVARRUBIAS
Materia: Sistemas Embebidos y Control SEPTIMO SEMESTRE
Ingeniero en Sistemas Computacionales
Universidad de Colima
Facultad de Ingeniera Mecnica y Elctrica
Academia de Arquitectura de Computadoras
Autor: Andrs Gerardo Fuentes
Covarrubias 2
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 3
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 4
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 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, mtodos y
eventos relacionados con el
puerto o los puertos seriales
de la aplicacin, crear tantos
como puertos seriales se
necesite.
Elegir dos controles:
2. 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 6
Manejo de puertos seriales
Controles en la aplicacin,
ToolStrip.
Observe que para .Net el
control para puerto serial
contiene todas las
propiedades para las
caractersticas de la trama
en tiempo de diseo
ComboBox
TextBox
Boton Label
Autor: Andrs Gerardo Fuentes
Covarrubias 7
Manejo de puertos seriales
Controles en la aplicacin, rea de
trabajo
TabControl
OvalShape
Botones
Label
Autor: Andrs Gerardo Fuentes
Covarrubias 8
Cdigo 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 cdigo fuente inicial solo describe las libreras a ser utilizadas al momento y el esqueleto inicial
para el namespace correspondiente a nuestra aplicacin.
Agregar estas referencias
externas
Autor: Andrs 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 cdigo al
botn Conectar del ToolStrip:
Las propiedades del control SerialPort se pueden establecer
en tiempo de diseo mediante el cuadro de propiedades.
Autor: Andrs Gerardo Fuentes
Covarrubias 10
Apertura de un puerto
serialPort1.BaudRate = 9600; // Velocidad de transmisin
serialPort1.Parity = Parity.None; //Tipo de paridad
serialPort1.DataBits = 8; //Nmero de bits de datos
serialPort1.StopBits = StopBits.One; //Nmero de bits de parada
serialPort1.PortName = toolStripTextBox1.Text; //Use el control adecuado para el usuario
serialPort1.Open(); //Abrir el puerto
Siempre se puede abrir un puerto con el cdigo siguiente y tambien establecer las
caracteristicas de la trama:
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 11
Transmisin
Siempre que haya un puerto
serial abierto se puede enviar
datos por ese puerto.
En el TabControl Terminal
Agregue dos controles
TextBox
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");
}
}
Agregue el cdigo del botn
Autor: Andrs Gerardo Fuentes
Covarrubias 12
Transmisin
byte[] miBuffer= new byte[1];
miBuffer[0] = 0x62; //Carcter a enviar por el puerto.
SP1.Write(miBuffer, 0, miBuffer.Length);
Siempre es posible enviar tambin un solo caracter por el puerto serial:
// Enviar trama
byte[] miBuffer= new byte[3]; // Tres caracteres mximo.
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:
Autor: Andrs Gerardo Fuentes
Covarrubias 13
Transmisin
Tambien se puede vincular cdigo a otros controles de usuario:
strBufferOut = "1"; //Buffer de transmisin
serialPort1.DiscardOutBuffer(); //Limpiamos el buffer de transmisin
serialPort1.Write(strBufferOut); //Enviar caracteres
Cada control incluye cdigo:
Indicadores con el control Ovalshape para simular
leds.
Salidas por botn
Autor: Andrs Gerardo Fuentes
Covarrubias 14
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 15
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 16
Recepcin
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
mtodo apropiado del control serialPort, el procedimiento consta de tres pasos:
Autor: Andrs Gerardo Fuentes
Covarrubias 17
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 18
Recepcin
2. El codigo del delegado
private void Actualiza_textbox(object s, EventArgs e)
{
txtRecibidos.Text += strBufferIn + "\r\n";
}
Autor: Andrs Gerardo Fuentes
Covarrubias 19
Status Strip
Siempre es posible manejar la barra de estado de nuestro formulario:
Barra de estado
Men de opciones
Autor: Andrs Gerardo Fuentes
Covarrubias 20
Status strip
Agregue un control timer
Para agregar el reloj del sistema a la barra de estado:
Configure las propiedades
Autor: Andrs Gerardo Fuentes
Covarrubias 21
Status strip
Ejecute los siguientes pasos en el orden indicado:
Agregar el cdigo 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
Autor: Andrs 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
Autor: Andrs Gerardo Fuentes
Covarrubias 23
ESQUEMATICO VERSION 1
Autor: Andrs 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
Autor: Andrs 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
Autor: Andrs Gerardo Fuentes
Covarrubias 26
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 27
Pinout del Pic18F4550
Autor: Andrs Gerardo Fuentes
Covarrubias 28
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 29
Ejemplo de salida de datos
Autor: Andrs Gerardo Fuentes
Covarrubias 30
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 31
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 32
Ejemplo de entrada de datos
Monitorear por medio de Terminal Virtual.
Entrada de datos por medio del control ComPim
Autor: Andrs Gerardo Fuentes
Covarrubias 33
Ejemplo de entrada de datos
Consulte el cdigo
siguiente, para
recepcin de datos
por medio del
mtodo de polling:
E:\Documentsand
Settings\fuentesg\Misd
Autor: Andrs Gerardo Fuentes
Covarrubias 34
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 35
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 36
Cdigo de la rutina de servicio a
interrupcin (ISR)
#int_rda //Rutina de servicio a interrupcion
void serial_isr()
{
valor=getchar(); //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); //Habilitar la interrupcion por recepcion
//de caracteres en el puerto serial
setup_adc_ports(NO_ANALOGS); //Las entradas analogicas configuradas como digitales
set_tris_b(0); //Todas salidas puerto B
set_tris_d(0b00000001); //RD0 salida de led de estado
output_b(0); //Apagamos todos los leds
Autor: Andrs Gerardo Fuentes
Covarrubias 37
Ejemplo de entrada de datos
Consulte el cdigo
siguiente, para
recepcin de datos
por medio del
mtodo de
interrupcin:
E:\Documentsand
Settings\fuentesg\Misd
Autor: Andrs Gerardo Fuentes
Covarrubias 38
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() //Todas son equivalentes y bsicamente esperan por un carcter
c = GETCH() // a ser recibido por la patilla RC6/RX del puerto serial
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.
Autor: Andrs Gerardo Fuentes
Covarrubias 39
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' ) //Entramos al bucle while
{
if ( kbhit () )
keypress=getc(); //En la variable keypress se guardan los
//caracteres
if (keypress==1) //Inicio del envo de un byte
output_high(PIN_B3);
else
output_low(PIN_B3)
}
Autor: Andrs Gerardo Fuentes
Covarrubias 40
Principales mandatos para
manejar el puerto serial CCS
Transmisin serial
PUTC() //Ambas instrucciones son equivalentes, basicamente
PUTCHAR() //envan un carcter a la patilla XMIT(RC7/TX) de
//del dispositivo RS232 del microcontrolador.
Ejemplo:
if (checksum==0)
putchar(ACK);
else
putchar(NAK); // NAK carcter de respuesta negativa
PUTS(string) //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).
Ejemplo: puts( " | HOLA |" );
Autor: Andrs Gerardo Fuentes
Covarrubias 41
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 42
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 43
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 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 mtodo Split
Procese los tokens encontrados
Autor: Andrs Gerardo Fuentes
Covarrubias 45
Cdigo
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;
}
}
}
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;
Autor: Andrs Gerardo Fuentes
Covarrubias 46
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) //Validamos numero de
//tokens encontrdos, deben ser 3
{
lblTemp.Text = parts[1]; //Actualizamos etiquetas
lblVolt.Text = parts[2];
}
lblRecibido.Text = recibidos; //Visualizamos trama actual
txtRecibidos.Text += recibidos+"\r\n"; //Actualizamos el textBox consola
}
Autor: Andrs Gerardo Fuentes
Covarrubias 47
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() 'Abrir el puerto Serie
Serie.Close() 'Cerrar el Puerto Serie
Serie.Dispose() 'Liberar objeto
Dim SiNo As Integer
SiNo = Serie.IsOpen 'El Puerto esta abierto?
Dim Puerto As String
Puerto = Serie.PortName 'Nombre del puerto
Autor: Andrs Gerardo Fuentes
Covarrubias 48
Principales mandatos para manejar el
puerto serial
'Manejo y Control de seales
Dim Estado As Boolean 'True=Activa / False=Inactiva
Estado = Serie.CDHolding 'Estado de la seal carrier detect
Estado = Serie.CtsHolding 'Seal Clear to Send
Estado = Serie.DsrHolding 'Seal Data Set Ready
Serie.DtrEnable = True 'Activar de Data Terminal Ready
Serie.RtsEnable = True 'Activar Request To Send
'Control Transmission/Recepcion
Serie.ReadBufferSize = 1024 'Dimensionar tamao buffer recepcin
Serie.WriteBufferSize = 1024 'Dimensionar tamao buffer envo
Serie.ReadTimeout = 10 'Fuera de tiempo para las lecturas
Serie.WriteTimeout = 10 'Fuera de tiempo para las escrituras
Serie.Handshake = Handshake.XOnXOff 'Tipo control para recepcin/envo
Serie.DiscardInBuffer() 'Borrar el buffer de entrada
Serie.DiscardOutBuffer() 'Borrar el buffer de salida
Autor: Andrs Gerardo Fuentes
Covarrubias 49
Principales mandatos para manejar el
puerto serial Visual C#
'Enviar datos
Contador = Serie.BytesToWrite 'Bytes en espera de ser escritos
Serie.Write("Hola Mundo") 'Enviar una cadena de caracteres
Serie.WriteLine("Hola Mundo") 'Enviar una lnea
'Leer datos
Contador = Serie.BytesToRead 'Bytes en espera de ser ledos
Serie.ReadByte() 'Leer un byte
Serie.ReadChar() 'Leer un char
Serie.ReadLine() 'Leer una lnea
Serie.ReadExisting() 'Leer los datos existentes en buffer
Autor: Andrs Gerardo Fuentes
Covarrubias 50
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 51
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 52
1. Creacin del control:
Autor: Andrs Gerardo Fuentes
Covarrubias 53
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
1. Definir un objeto tipo lista:
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 54
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 55
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 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";
}
Autor: Andrs Gerardo Fuentes
Covarrubias 57
RESOLUCIN DE DUDAS
fuentesg@ucol.mx
fuentesg85@hotmail.com
fuentesg@gmail.com
Facebook: /Andres.FuentesCovarrubias

También podría gustarte