Comunicaciones Seriales Con Visual C# 2010
Comunicaciones Seriales Con Visual C# 2010
Comunicaciones Seriales Con Visual C# 2010
Comunicaciones seriales
Caso: Visual C# 2010 Express
PIC18F4550 CCS PICC M.C. 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
Despus Aplicacin de Windows Forms y el botn Aceptar despus de darle nombre al nuevo proyecto
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
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
OvalShape Label
Botones
Las propiedades del control SerialPort se pueden establecer en tiempo de diseo mediante el cuadro de propiedades.
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
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
Fuentes 11
Covarrubias
Transmisin
Siempre es posible enviar tambin un solo caracter por el puerto serial:
byte[] miBuffer= new byte[1];
Transmisin
Tambien se puede vincular cdigo a otros controles de usuario:
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.
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.
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); }
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;
Recepcin
2. El codigo del delegado private void Actualiza_textbox(object s, EventArgs e) { txtRecibidos.Text += strBufferIn + "\r\n"; }
18
Status Strip
Siempre es posible manejar la barra de estado de nuestro formulario:
19
Status strip
Para agregar el reloj del sistema a la barra de estado:
20
Status strip
Ejecute los siguientes pasos en el orden indicado: 1 2
Cambie la propiedad Text a hh:mm:ss
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
23
24
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
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
29
30
31
Monitorear por medio de Terminal Virtual. Entrada de datos por medio del control ComPim
32
33
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.
34
35
//-----------------------------------------------------------------------------------------------//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
36
37
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
38
//En la variable keypress se guardan los //caracteres //Inicio del envo de un byte
39
// 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:
40
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
42
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; } }
45
46
47
'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
48
'Bytes en espera de ser ledos 'Leer un byte 'Leer un char 'Leer una lnea 'Leer los datos existentes en buffer
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.
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.
51
52
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
53
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
[email protected] [email protected] [email protected] Facebook: /Andres.FuentesCovarrubias
57