Sie sind auf Seite 1von 55

Caso:

Visual C# 2012 Express


MICROCHIP MCP2200
Por:

M.C. ANDRS GERARDO FUENTES COVARRUBIAS

Sistemas Digitales Avanzados


1

Instalacin

de Virtual Serial Port


Creacin de una nueva aplicacin en
C# 2012
toolStrip y componentes bsicos
Manejo de los puertos seriales
Apertura de un puerto
Transmisin
Recepcin
Autor: Andrs Gerardo Fuentes Covarrubias

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# 2012

Autor: Andrs Gerardo Fuentes Covarrubias

Abrir VC# 2012 y elegir


Archivo->Nuevo Proyecto

Despus Aplicacin de Windows Forms y el botn


Aceptar despus de darle nombre al nuevo
proyecto

Autor: Andrs Gerardo Fuentes Covarrubias

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.

2. Para manejo de los


controles bsicos de las
comunicaciones seriales,
as 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

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

Controles en la aplicacin, rea


de trabajo

toolStrip
TabControl

OvalShape

Botones
Autor: Andrs Gerardo Fuentes Covarrubias

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();
}

El cdigo fuente inicial solo describe las


libreras a ser utilizadas al momento y el
esqueleto inicial para el namespace
correspondiente a nuestra aplicacin.
Por lo general, este esqueleto de Clase
principal es creada por VisualStudio al
momento de inicializar el nuevo proyecto.
Finalmente el desarrollador debe indicar
explcitamente las referencias externas con
instrucciones using seguidas del
namespace relacionado con la librera.

Agregar estas referencias


externas

private void Form1_Load(object sender,


EventArgs e)
{
}
}

Autor: Andrs Gerardo Fuentes Covarrubias

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

Siempre se puede abrir un puerto con el cdigo siguiente y tambien


establecer las caracteristicas de la trama:
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
Vincule el cdigo anterior con un botn y podr abrir el puerto serial capturado en el
control toolStripTextBox1 al presionar el botn Conectar
Sin embargo, es recomendable usar los controles adecuados que listen los recursos
reconocidos por el sistema y que los pongan a disposicin del usuario de la aplicacin,
para eso se agregaran en el toolStrip.

Autor: Andrs Gerardo Fuentes Covarrubias

10

Siempre que haya un puerto serial abierto se puede enviar datos por ese
puerto.
En el TabControl Consola, 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 Covarrubias

11

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];

// Tres caracteres mximo.

miBuffer[0] = 0x74;
miBuffer[1] = 0x54;
miBuffer[2] = 0x13;
SP1.Write(miBuffer, 0, miBuffer.Length);
Autor: Andrs Gerardo Fuentes Covarrubias

12

Tambin 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";
//Buffer de transmisin
serialPort1.DiscardOutBuffer();//Limpiamos el buffer de
transmisin
serialPort1.Write(strBufferOut);
//Enviar caracteres
Autor: Andrs Gerardo Fuentes Covarrubias

13

El control comboBox nos permite listar los recursos hardware de


comunicaciones seriales.

Tambin mediante un control textBox se puede


visualizar el puerto serial seleccionado, posteriormente
mediante un Botn ejecutar el cdigo vinculado con la
apertura del puerto.
Un control adicional tipo Label se puede visualizar si el
puerto seleccionado esta en estado Conectado o No
Conectado, tambin cambiar la propiedad ForeColor a
Green o Red respectivamente.
Autor: Andrs Gerardo Fuentes Covarrubias

14

private void UpdateSerialPorts()


{
toolStripComboBox1.Items.Clear();
// Aadir solo los puertos vlidos
try
{
foreach (String d in SerialPort.GetPortNames())
{ toolStripComboBox1.Items.Add(d);}
}
catch
{
UpdateSerialPorts();
return;
}
toolStripComboBox1.SelectedIndex = toolStripComboBox1.Items.Count - 1;
if (toolStripComboBox1.Items.Count > 0)
{
toolStripComboBox1.SelectedIndex = 0;
toolStripTextBox1.Text =
toolStripComboBox1.Items[toolStripComboBox1.SelectedIndex].ToString();
}
}
Autor: Andrs Gerardo Fuentes Covarrubias

15

private void btActualizar_Click(object sender,


EventArgs e)
{
UpdateSerialPorts();
}

El cdigo de Actualizar nos permite atender un evento de Conexin


en caliente. Es decir cuando un usuario conecta una nueva interfaz
serial USB cuando nuestra aplicacin se esta ejecutando, de esta
manera se puede actualizar la coleccin de datos del control
comboBox y el usuario podr localizar en esta su interfaz.
Autor: Andrs Gerardo Fuentes Covarrubias

16

Invocar la funcin UpdateSerialPorts() en nuestra funcin


Form_Load1() para que la coleccin de nombres de puertos
sea actualizada en el mismo momento de la carga de la
forma principal.
private void Form1_Load(object sender, EventArgs e)
{
UpdateSerialPorts();
lblEstadoPuerto.Text = "No Conectado";
lblEstadoPuerto.ForeColor = Color.Red;
conectado = false;
}

Autor: Andrs Gerardo Fuentes Covarrubias

17

Agregar un evento para actualizar el textBox del toolStrip cada vez


que el nombre de puerto serial cambie, de esta manera se podr
conectar el puerto serial correcto al presionar el botn Conectar

private void toolStripComboBox1_TextChanged(object sender, EventArgs


e)
{
toolStripTextBox1.Text =
toolStripComboBox1.Items[toolStripComboBox1.SelectedIndex].ToString
();
}

Autor: Andrs Gerardo Fuentes Covarrubias

18

Agregue

una variable booleana tipo


bandera para el manejo del estado
del puerto serial, de esta manera
ser mas cmoda la validacin del
estado de la interfaz de
comunicaciones.

public

Boolean conectado;
Autor: Andrs Gerardo Fuentes Covarrubias

19

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

20

Crear un nuevo control


TextBox, que sea multilnea,
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

21

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

22

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;
"Split"

//Guardamos la cadena original para


//Posterior

this.Invoke(new
EventHandler(Actualiza_textbox));
Autor:
Andrs Gerardo Fuentes Covarrubias

23

2. El codigo del delegado


private void Actualiza_textbox(object s, EventArgs e)
{
txtRecibidos.Text += strBufferIn + "\r\n";
}

Autor: Andrs Gerardo Fuentes Covarrubias

24

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

Barra de estado
Men de opciones

Autor: Andrs Gerardo Fuentes Covarrubias

25

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

Agregue un control
timer

Configure las
propiedades

Autor: Andrs Gerardo Fuentes Covarrubias

26

Ejecute los siguientes pasos en el orden indicado:


3
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

27

Control

mas efectivo sobre los


caracteres delimitadores
Posibilidad de hacer parsing en lnea

Autor: Andrs Gerardo Fuentes Covarrubias

28

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

29

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

30

using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
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

31

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];

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

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

Autor: Andrs Gerardo Fuentes Covarrubias

32

'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

33

'Manejo y Control de seales


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

34

'Enviar datos
Contador = Serie.BytesToWrite
escritos
Serie.Write("Hola Mundo")
caracteres
Serie.WriteLine("Hola Mundo")
'Leer datos
Contador = Serie.BytesToRead
Serie.ReadByte()
'Leer
Serie.ReadChar()
'Leer
Serie.ReadLine()
'Leer
Serie.ReadExisting()
'Leer

'Bytes en espera de ser


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

Autor: Andrs Gerardo Fuentes Covarrubias

35

Interfaz serial RS232C MCP2200


Circuito LM35z a C
Registrador de temperaturas
Graficador de 2 canales

Autor: Andrs Gerardo Fuentes Covarrubias

36

El hardware de interfaz consta de


un convertidor de protocolo serial
paralelo a USB, lo que lo hace muy
atractivo para estas aplicaciones.
El circuito esta basado en el
MCP2200 de Microchip, este cuenta
con una DLL (librera) muy rica en
funciones para configuracin de
patillaje, entrada de niveles
digitales y salidas de control.

Autor: Andrs Gerardo Fuentes Covarrubias

37

Principales
caractersticas:
Modo full duplex hasta 1Mbps
Manejo de la conexin en modo
Virtual Serial Port bajo todas las
versiones de Windows, Linux y Mac
Soporta Control de flujo
Hasta 8 pines de propsito general
Memoria de usuario de 256 bytes de
propsito general
Leds de actividad para el monitoreo
del bus
Totalmente programable en
lenguajes visuales mediante DLL de
usuario.

Autor: Andrs Gerardo Fuentes Covarrubias

38

Autor: Andrs Gerardo Fuentes Covarrubias

39

Para

la implementacin del modelo


de programacin basta con instalar
la referencia externa en el proyecto
a la DLL provista por el fabricante.
Invocacin de los objetos y mtodos
dentro del cdigo del proyecto

Autor: Andrs Gerardo Fuentes Covarrubias

40

bool

ClearPin(pinNumber)

Pone en nivel 0 pinNumber

bool

SetPin(pinNumber)

Pone en nivel 1 pinNumber

bool

ReadPin(pinNumber, *pinValue)

Lee el nivel lgico en la entrada pinNumber

y lo refleja en la variable booleana pinValue


int

ReadPinValue(pinNumber)

Lee el nivel lgico en la entrada pinNumber

Autor: Andrs Gerardo Fuentes Covarrubias

41

bool

ReadPort(*portValue)

Lee el valor completo del puerto GPx

como int y lo refleja en la variable


portValue
bool

ReadPort(*portValue)

bool

WritePort(portValue)

Autor: Andrs Gerardo Fuentes Covarrubias

42

void
bool

InitMCP2200(VID, PID)
ConfigureIO(mask)

Autor: Andrs Gerardo Fuentes Covarrubias

43

bool IsConnected()
int ReadEEPROM(uiEEPAddress)
int WriteEEPROM(uiEEPAddress,

ucValue)

Autor: Andrs Gerardo Fuentes Covarrubias

44

ComPim: Para salida de


datos por medio de un
Virtual Port

Monitoreo por medio de


la Terminal Virtual

Autor: Andrs Gerardo Fuentes Covarrubias

45

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

46

Comunicaciones Full-Duplex
Compatibilidad 9600, 8 , N, 1
Programable en lenguaje de alto

nivel
BaudRate totalmente configurable
Capaz de manejar e identificar
paridad

Autor: Andrs Gerardo Fuentes Covarrubias

47

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

48

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

49

Autor: Andrs Gerardo Fuentes Covarrubias

50

1. Definir un objeto tipo lista:

Consiste en la
inicializacin del
control
Generalmente se
efecta 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

51

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

52

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

53

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

54

fuentesg@ucol.mx
fuentesg85@hotmail.com
fuentesg@gmail.com
Facebook:

/Andres.FuentesCovarrubias

Autor: Andrs Gerardo Fuentes Covarrubias

55

Das könnte Ihnen auch gefallen