Está en la página 1de 57

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

Comunicaciones seriales Caso: Visual C# 2010 Express
Comunicaciones seriales
Caso: Visual C# 2010 Express

PIC18F4550 -

CCS – PICC

M.C. ANDRÉS GERARDO FUENTES COVARRUBIAS

Autor: Andrés Gerardo Fuentes Covarrubias

1

Metodología
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

Autor: Andrés Gerardo Fuentes Covarrubias

2

Virtual Serial Port
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

Autor: Andrés Gerardo Fuentes Covarrubias

3

Creación de una nueva aplicación
Creación de una nueva aplicación

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

Creación de una nueva aplicación Después “Aplicación de Windows Forms y el botón “Aceptar” después de
Creación de una nueva aplicación Después “Aplicación de Windows Forms y el botón “Aceptar” después de

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

Creación de una nueva aplicación Después “Aplicación de Windows Forms y el botón “Aceptar” después de

Autor: Andrés Gerardo Fuentes Covarrubias

4

Manejo de los puertos seriales

• Elegir dos controles: 1. Para manejo de los puertos seriales: “SerialPort”, será el encargado de
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.
Estos controles no son visibles en la
forma principal, por lo tanto se
colocan en el “Status Strip”

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

Autor: Andrés Gerardo Fuentes Covarrubias

5

Manejo de puertos seriales
Manejo de puertos seriales

Controles en la aplicación, ToolStrip.

ComboBox

Boton Label TextBox
Boton
Label
TextBox

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

Manejo de puertos seriales Controles en la aplicación, ToolStrip. ComboBox Boton Label TextBox Observe que para

Autor: Andrés Gerardo Fuentes Covarrubias

6

Manejo de puertos seriales
Manejo de puertos seriales

Controles en la aplicación, área de trabajo

Manejo de puertos seriales Controles en la aplicación, área de trabajo Botones Autor: Andrés Gerardo Fuentes

Botones

Autor: Andrés Gerardo Fuentes Covarrubias

TabControl

OvalShape

Label

7

Código fuente inicial

Código fuente inicial using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using

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;

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 consolaSerialCDC {

public partial class Form1 : Form {

public Form1() { InitializeComponent(); }

private void Form1_Load(object sender, EventArgs e) {

}

}

Código fuente inicial using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using

Autor: Andrés Gerardo Fuentes Covarrubias

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 referencias externas

8

Manejo de los puertos seriales

La apertura de un puerto serial en Visual C# es tan sencillo como agregar el siguiente
La apertura de un puerto serial en Visual C# es tan sencillo como agregar el siguiente código al
botón “Conectar” del ToolStrip:
if(!serialPort1.IsOpen)
{
try
{
serialPort1.Open();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Manejo de los puertos seriales La apertura de un puerto serial en Visual C# es tan

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

Autor: Andrés Gerardo Fuentes Covarrubias

9

Apertura de un puerto
Apertura de un puerto

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

serialPort1.BaudRate = 9600; serialPort1.Parity = Parity.None; serialPort1.DataBits = 8; serialPort1.StopBits = StopBits.One;

// Velocidad de transmisión //Tipo de paridad //Número de bits de datos //Número de bits de parada

serialPort1.PortName = toolStripTextBox1.Text; //Use el control adecuado para el usuario

serialPort1.Open();

//Abrir el puerto

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”

Autor: Andrés Gerardo Fuentes Covarrubias

10

Transmisión •Siempre que haya un puerto serial abierto se puede enviar datos por ese puerto. •En
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
Agregue el código del 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");

}

}

Autor: Andrés Gerardo Fuentes

Transmisión
Transmisión

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

byte[] miBuffer= new byte[1];

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

//Carácter 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];

// Tres caracteres máximo.

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

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

Autor: Andrés Gerardo Fuentes Covarrubias

12

Transmisión Tambien se puede vincular código a otros controles de usuario: Indicadores con el control Ovalshape
Transmisión
Tambien se puede vincular código a otros controles de usuario:
Indicadores con el control Ovalshape para simular
leds.
Salidas por botón
Cada control incluye código:

strBufferOut = "1";

serialPort1.DiscardOutBuffer();

serialPort1.Write(strBufferOut);

//Buffer de transmisión //Limpiamos el buffer de transmisión //Enviar caracteres

Autor: Andrés Gerardo Fuentes Covarrubias

13

Recepción
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.

Autor: Andrés Gerardo Fuentes Covarrubias

14

Recepción Crear un nuevo control TextBox, que sea multilinea, con ScrollBar vertical y ajustado a la
Recepción
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 aplicación, los datos enviados y los recibidos.
Recepción Crear un nuevo control TextBox, que sea multilinea, con ScrollBar vertical y ajustado a la

Autor: Andrés Gerardo Fuentes Covarrubias

15

Recepción
Recepción

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:

  • 1. Codigo de al cargar el formulario:

public Form1() {

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

}

serialPort1_DataReceived);

Autor: Andrés Gerardo Fuentes Covarrubias

16

Recepción

2. El codigo del manejador de eventos private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { strBufferIn =
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: Andrés Gerardo Fuentes
Covarrubias
17
Recepción
Recepción

2. El codigo del “delegado”

private void Actualiza_textbox(object s, EventArgs e) {

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

}

Autor: Andrés Gerardo Fuentes Covarrubias

18

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

•Barra de estado

•Menú de opciones

Autor: Andrés Gerardo Fuentes Covarrubias

19

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

Agregue un control “timer”

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

Configure las propiedades

Autor: Andrés Gerardo Fuentes Covarrubias

20

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

2

Status strip Ejecute los siguientes pasos en el orden indicado: 1 2 Cambie la propiedad “Text”

3

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

Agregar el código al control del timer:

private void timer1_Tick(object sender, EventArgs e) {

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

}

Status strip Ejecute los siguientes pasos en el orden indicado: 1 2 Cambie la propiedad “Text”

Autor: Andrés Gerardo Fuentes Covarrubias

21

Caso de estudio
Caso de estudio

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

Autor: Andrés Gerardo Fuentes Covarrubias

22

ESQUEMATICO VERSION 1
ESQUEMATICO VERSION 1

Autor: Andrés Gerardo Fuentes Covarrubias

23

Controles para el modelado en Proteus ISIS ComPim: Para salida de datos por medio de un
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
Controles para el modelado en Proteus ISIS ComPim: Para salida de datos por medio de un
Controles para el modelado en Proteus ISIS ComPim: Para salida de datos por medio de un

Autor: Andrés Gerardo Fuentes Covarrubias

24

LoopBack serial Isis Proteus
LoopBack serial Isis Proteus
LoopBack serial Isis Proteus Interconecta por “cable cruzado” la terminal virtual y el control ComPim Por

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: Andrés Gerardo Fuentes Covarrubias

25

Modelo de programación del microcontrolador PIC18F4550 para comunicaciones seriales
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

Autor: Andrés Gerardo Fuentes Covarrubias

26

Pinout del Pic18F4550
Pinout del Pic18F4550

Autor: Andrés Gerardo Fuentes Covarrubias

27

Comunicaciones en CCS
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 por medio 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()

Autor: Andrés Gerardo Fuentes Covarrubias

28

Ejemplo de salida de datos
Ejemplo de salida de datos

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

Autor: Andrés Gerardo Fuentes Covarrubias

30

Entrada de datos en CCS
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

Autor: Andrés Gerardo Fuentes Covarrubias

31

Ejemplo de entrada de datos

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

Autor: Andrés Gerardo Fuentes Covarrubias

32

Ejemplo de entrada de datos
Ejemplo de entrada de datos

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

Ejemplo de entrada de datos Consulte el código siguiente, para recepción de datos por medio del

E:\Documents and ettings\fuentesg\Mis

Autor: Andrés Gerardo Fuentes Covarrubias

33

Tipos de interrupciones en CCS

#INT_xxx - Indica que la función que le sigue (en el código fuente CCS) es una
#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.

Autor: Andrés Gerardo Fuentes Covarrubias

34

Las interrupciones por el puerto serie
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.

Autor: Andrés Gerardo Fuentes Covarrubias

35

Código de la rutina de servicio a interrupción (ISR)

Código de la rutina de servicio a interrupción (ISR) #int_rda void serial_isr() { valor=getchar(); } //Rutina

#int_rda void serial_isr() {

valor=getchar();

}

//Rutina de servicio a interrupcion

//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

setup_adc_ports(NO_ANALOGS);

//de caracteres en el puerto serial //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: Andrés Gerardo Fuentes Covarrubias

36

Ejemplo de entrada de datos
Ejemplo de entrada de datos

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

Ejemplo de entrada de datos Consulte el código siguiente, para recepción de datos por medio del

E:\Documents and ettings\fuentesg\Mis

Autor: Andrés Gerardo Fuentes Covarrubias

37

Principales mandatos para manejar el puerto serial CCS Inicialización del puerto serial #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,
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 datos
c = GETC()
c = GETCH()
//Todas son equivalentes y básicamente esperan por un carácter
// 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 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.

Autor: Andrés Gerardo Fuentes Covarrubias

38

Principales mandatos para manejar el puerto serial CCS KBHIT()
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' ) {

if ( kbhit () ) keypress=getc();

if (keypress==‘1’)

output_high(PIN_B3);

else

output_low(PIN_B3)

}

//Entramos al bucle while

//En la variable keypress se guardan los //caracteres

//Inicio del envío de un byte

Autor: Andrés Gerardo Fuentes Covarrubias

39

Principales mandatos para manejar el puerto serial CCS
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);

else

putchar(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 |" );

Autor: Andrés Gerardo Fuentes Covarrubias

40

Principales mandatos para manejar el puerto serial CCS Función printf() y modificadores
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.

Principales mandatos para manejar el puerto serial CCS Función printf() y modificadores La función de impresión

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: Andrés Gerardo Fuentes Covarrubias

41

Manejo del buffer de recepción en Visual C#
Manejo del buffer de recepción
en Visual C#

Control mas efectivo sobre los caracteres delimitadores

Posibilidad de hacer parsing en línea

Autor: Andrés Gerardo Fuentes Covarrubias

42

Manejo del buffer de recepción (código)
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));

}

Autor: Andrés Gerardo Fuentes Covarrubias

43

Split Tokens en C#
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

Autor: Andrés Gerardo Fuentes Covarrubias

44

Código using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using
Código
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;
public Form1()
{
InitializeComponent();
}
private void btSplit_Click(object
sender, EventArgs e)
{
str = txtCadena.Text;
string[] parts = str.Split(seps);
namespace splitCampos
{
for (int i = 0; i < parts.Length;
i++)
public partial class Form1 : Form
{
string str;
char[] seps={','};
string cadenaSplit;
cadenaSplit +=
parts[i]+"\r\n";
txtConsola.Text = cadenaSplit;
}
}
}
Código using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using

Autor: Andrés Gerardo Fuentes Covarrubias

45

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

private void Actualiza_textbox(object s, EventArgs e) {

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

if (parts.Length == 3)

{

lblTemp.Text = parts[1]; lblVolt.Text = parts[2];

} lblRecibido.Text = recibidos; txtRecibidos.Text += recibidos+"\r\n";

}

//Tokenizamos la trama

//Validamos numero de //tokens encontrdos, deben ser 3

//Actualizamos etiquetas

//Visualizamos trama actual //Actualizamos el textBox consola

Autor: Andrés Gerardo Fuentes Covarrubias

46

Principales mandatos para manejar el puerto serial
Principales mandatos para manejar el
puerto serial

'Definir las características de la comunicación

Serie.BaudRate = 19200 Serie.DataBits = 8 Serie.Parity = Parity.Even Serie.StopBits = StopBits.Two

'Fijar velocidad de comunicaciones 'Longitud en bits para Byte de datos 'Asignar paridad(enumeration parity) 'Bits parada después 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: Andrés Gerardo Fuentes Covarrubias

47

Principales mandatos para manejar el puerto serial
Principales mandatos para manejar el
puerto serial

'Manejo y Control de señales

Dim Estado As Boolean

'True=Activa / False=Inactiva

Estado = Serie.CDHolding Estado = Serie.CtsHolding Estado = Serie.DsrHolding Serie.DtrEnable = True Serie.RtsEnable = True

'Estado de la señal carrier detect 'Señal Clear to Send 'Señal 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

'Dimensionar tamaño buffer recepción 'Dimensionar tamaño buffer envío 'Fuera de tiempo para las lecturas 'Fuera de tiempo para las escrituras

Serie.Handshake = Handshake.XOnXOff 'Tipo control para recepción/envío

Serie.DiscardInBuffer()

Serie.DiscardOutBuffer()

'Borrar el buffer de entrada 'Borrar el buffer de salida

Autor: Andrés Gerardo Fuentes Covarrubias

48

Principales mandatos para manejar el puerto serial Visual C#
Principales mandatos para manejar el
puerto serial Visual C#

'Enviar datos

Contador = Serie.BytesToWrite Serie.Write("Hola Mundo") Serie.WriteLine("Hola Mundo")

'Bytes en espera de ser escritos 'Enviar una cadena de caracteres 'Enviar una línea

'Leer datos

Contador = Serie.BytesToRead Serie.ReadByte() Serie.ReadChar() Serie.ReadLine() Serie.ReadExisting()

'Bytes en espera de ser leídos 'Leer un byte 'Leer un char 'Leer una línea 'Leer los datos existentes en buffer

Autor: Andrés Gerardo Fuentes Covarrubias

49

Uso de ZedGraph
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.

Autor: Andrés Gerardo Fuentes Covarrubias

50

Uso de ZedGraph
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.

Autor: Andrés Gerardo Fuentes Covarrubias

51

1. Creación del control: Autor: Andrés Gerardo Fuentes Covarrubias 52
1. Creación del control:
Autor: Andrés Gerardo Fuentes
Covarrubias
52
2. Inicialización
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; // Titulos myPane.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_Load1

  • 4. No olvidar referenciar el NameSpace ZedGraph con el Using correspondiente

Autor: Andrés Gerardo Fuentes Covarrubias

53

3. Código del usuario private void Form1_Load(object sender, EventArgs e) { UpdateSerialPorts(); inicializaGrafico(graficoTemp); } private void
3. Código 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 = "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);
}

Autor: Andrés Gerardo Fuentes Covarrubias

54

4. Función de recepción con Split campos
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

Autor: Andrés Gerardo Fuentes Covarrubias

55

private void Actualiza_textbox(object s, EventArgs e) { string[] parts = strBufferIn.Split(seps); if (parts.Length == 3) {
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: Andrés Gerardo Fuentes Covarrubias

56

RESOLUCIÓN DE DUDAS
RESOLUCIÓN DE DUDAS

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

Autor: Andrés Gerardo Fuentes Covarrubias

57