You are on page 1of 10

11/6/2014 PUERTO SERIAL Y C#

http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 1/10
PUERTO SERIAL Y C#
(1/1)
washi_w_z_r:
hola a todos , se lo doloroso que es buscar y buscar y rebuscar en la red temas como puerto serial ,usb y
paralelo, yo tambien sufri .... ajajajaja weno mi aporte a este for es que yo hice un prog en c# 2005 que recibe
datos desde el pic16f877(tiene un prog que envia datos desde el ADC y lo envia ia RS232).
este codigo lo encontre por ahi y es en asembler (cuanto quiesiera que fuera en c o c++ o ...) :bang:
weno el cod es el siguiente:Cdigo:
include "p16f877.inc"

ADDR_L equ 0x20
DATA_L equ 0x21
org 0x00
nop
nop

bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1

movlw b'01000001' ;A/D conversion Fosc/8
movwf ADCON0

bsf STATUS,RP0 ;Ir banco 1
bcf STATUS,RP1
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 2/10

clrf TRISA ;PORTA salida
clrf TRISB ;PORTB salida
clrf TRISC ;PORTC salida
clrf TRISD ;PORTD salida
clrf TRISE

movlw b'00001110' ;A/D Port AN0/RA0
movwf ADCON1

bsf TRISA,0 ;Canal AN0 como entrada

bcf TRISC,6 ;RC6/TX salida, pin de transmisin
movlw d'12' ;2400 baud rate Xtal=4Mhz
movwf SPBRG
bcf TXSTA,BRGH ;Seleccin de baja velocidad
bcf TXSTA,SYNC ;Modo asncrono

bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1

bsf RCSTA,SPEN ;habilita el puerto serie

11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 3/10
bsf STATUS,RP0 ;Ir banco 1
bcf STATUS,RP1

bcf TXSTA,TX9 ;8 bits de datos a transmitir
bsf TXSTA,TXEN ;Activa la transmisin serial, TXIF = 1

bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1
_adc
bsf ADCON0,GO ;Start A/D conversion
_espera
btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
goto _espera ;No, ir _espera
movf ADRESH,W ;Si, W=ADRESH
movwf TXREG ;TXREG = W
movwf PORTC ;PORTC = W
_esperatx
btfss PIR1,TXIF ;Espera hasta que transmisin culmin
goto _esperatx
goto _adc ;Ir adc

end
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 4/10
Si lo compilan veran que no les manda error.
weno sigamos , el cod para c# es mas sencillo de lo que creia, ya que tiene incorporado el fabuloso
System.IO.PORTS (bendito sean los programadoires de c# por aliviar la carga) , digo esto por que tanto en
c++, visual basic, java y todos aquellos prog anteriores a visual studio 2005 , carecian de estas librerias , y para
realizar la interfaz con el puerto serial tenias que crear o llamar a los infernales dll, cosa obviamnete no pasa en
c# , weno el cog que desarrolle es:
Cdigo:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace Prueba_Serial
{
public partial class Form1 : Form
{
// Este delegado asincrnico permite las llamadas para establecer
//el texto de propiedad en un TextBox control.
delegate void SetTextCallback(string text);

private int[] baudRates = new int[11];
internal void CargarListas()
{
toolStripLabel1.Text = "PUERTO";
toolStripLabel2.Text = "PARIDAD";
toolStripLabel3.Text = "BAUDRATE";
toolStripLabel4.Text = "HAND SHAKING";
}
internal void InicializacionPuerto()
{
// Bit rates to select from.
baudRates[0] = 300;
baudRates[1] = 600;
baudRates[2] = 1200;
baudRates[3] = 2400;
baudRates[4] = 9600;
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 5/10
baudRates[5] = 14400;
baudRates[6] = 19200;
baudRates[7] = 38400;
baudRates[8] = 57600;
baudRates[9] = 115200;
baudRates[10] = 128000;
// colocamos la config de baudios en un combo box desplegable.
cmbBaudRate.DataSource = baudRates;
cmbBaudRate.DropDownStyle = ComboBoxStyle.DropDownList;
//Opciones HandShaking
cmbHandShaking.Items.Add(Handshake.None);
cmbHandShaking.Items.Add(Handshake.RequestToSend);
cmbHandShaking.Items.Add(Handshake.RequestToSendXOnXOff);
cmbHandShaking.Items.Add(Handshake.XOnXOff);
cmbHandShaking.DropDownStyle = ComboBoxStyle.DropDownList;
//OPCIONES DE PARIDAD
cmbParidad.Items.Add(Parity.Even); //Establece el bit de paridad como par
cmbParidad.Items.Add(Parity.Mark); //Deja el bit de paridad a 1
cmbParidad.Items.Add(Parity.None); //Ninguna paridad ocurre
cmbParidad.Items.Add(Parity.Odd); //Establece el bit de paridad como impar
cmbParidad.Items.Add(Parity.Space); //Deja el bit de paridad a cero
}
public Form1()
{
InitializeComponent();
CargarListas();
InicializacionPuerto();
//BUSACANDO TODOS LOS PUERTOS HABILITADOS
string[] ports = SerialPort.GetPortNames();
//AGREGAMOS LOS PUERTOS AL COMBOBOX
foreach (string port in ports)
{
cmbPuertos.Items.Add(port);
}
}
private void cmbPuertos_SelectionChangeCommitted(object sender, EventArgs e)
{
if(serialPort1.IsOpen)
{
serialPort1.Close();
}
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 6/10

}
private void btnGuardProp_Click(object sender, EventArgs e)
{
serialPort1.BaudRate = int.Parse(cmbBaudRate.SelectedItem.ToString());
serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParidad.SelectedItem.ToString());
serialPort1.Handshake = (Handshake)Enum.Parse(typeof(Handshake),
cmbHandShaking.SelectedItem.ToString());
toolStripLabel1.Text = "PUERTO = " + serialPort1.PortName;
toolStripLabel2.Text = "PARIDAD = " + serialPort1.Parity;
toolStripLabel3.Text = "HANDSHAKING =" + serialPort1.Handshake;
toolStripLabel4.Text = "BIT RATE =" + serialPort1.BaudRate;
panel1.Hide();
btnStart.Enabled = true;
}
private void btnRestaurar_Click(object sender, EventArgs e)
{
Close();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
panel1.Show();
}
/*
private void serialPort1_ErrorReceived_1(object sender, SerialErrorReceivedEventArgs e)
{
SerialError SerialErrorReceived=0;
SerialErrorReceived = e.EventType;

switch (SerialErrorReceived)
{
case SerialError.Frame:
MessageBox.Show("ERROR TRAMA", "");//, MessageBoxButtons.OK,
MessageBoxIcon.Warning);
lblError1.Text = "SIN ERROR";
break;
case SerialError.Overrun:
MessageBox.Show("SATURACION DEL BUFFER", "", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
break;
case SerialError.RXOver:
MessageBox.Show("DESBORDAMIENTO DE BFER DE ENTRADA", "",
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 7/10
MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
//Con la paridad EVEN, los bits datos y la paridad en cada palabra contiene incluso nmeros de
unos.
//Con al paridad ODD, los bits datos y la paridad en cada palabra contiene nmeros impares de unos.
//MARK y SPACE son formas de mantener la paridad, con paridad MARK, la paridad siempre es 1
//Con la paridad SPACE la paridad es siempre 0.
case SerialError.RXParity:
MessageBox.Show("ERROR DE PARIDAD", "", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
break;
case SerialError.TXFull:
MessageBox.Show("BUFFER LLENO", "", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
break;
}
}

private void Form1_Load(object sender, EventArgs e)
{
btnSTOP.Enabled = false;
btnStart.Enabled = false;
}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort1.BytesToRead > 1)
{
SetText(this.serialPort1.ReadByte().ToString());
}
}
private void SetText(string text)
{
if (this.listBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Add(text);
int envio;
envio = Convert.ToInt16((text.ToString()));
}
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 8/10

}
private void btnStart_Click(object sender, EventArgs e)
{
//plotter2.Start();
// tratar de abrir el puerto
try
{
serialPort1.Close();
serialPort1.Open();
}
catch
{
MessageBox.Show("PUERTO SERIAL NO SE PUEDE ABRIR");
}
btnSTOP.Enabled = true;
btnStart.Enabled = false;

}


private void btnSTOP_Click(object sender, EventArgs e)
{
plotter1.Stop();
plotter2.Stop();
serialPort1.Close();
btnStart.Enabled = true;
btnSTOP.Enabled = false;
}
private void serialPort1_PinChanged(object sender, SerialPinChangedEventArgs e)
{
SerialPinChange SerialPinChange1 = 0;
bool SignalState = false;
switch (SerialPinChange1)
{
case SerialPinChange.CDChanged:
SignalState = serialPort1.CDHolding;
lblCD.Text = "CD= " + SignalState.ToString();

break;
case SerialPinChange.CtsChanged:
SignalState = serialPort1.CtsHolding;
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 9/10
lblCts.Text = "CTS = " + SignalState.ToString();
break;
case SerialPinChange.Ring:
lblRing.Text = "Ring";
break;
}
}

}
}
weno la parte mas importante de todo este cod es el evento "serialPort1_DataReceived" que nos dara la lectura
del puerto serial.
En la parte de "private void SetText(string text)" , es donde convierto los caracteres en numeros enteros que los
visualizo en un list box.
Yo soy un novato en c# asi como en pic(programando en c) , por ello me envia error de trama, no es por el cod
en c# sino por la del pic , la idea es la siguiente desde la pc enviamos un caracter por ejm "A" , el pic lo recibe y
este envia los datos desde al ADC , si mandamos otro caracter "B" , el pic dejara de enviar datos(esto no lo he
implementado en el pic) para evitar este error de trama.
en eso estoy , pero mi puerto serial se malogro asi que no puedo hacer mas pruebas, pero si necesitan ayuda y
podemos corregir los codigos que deje seria genail.
nos vemos, :bang:
Ariel:
Hola amigo!
Bienvenido al foro, y gracias por el aporte! :bang:
Saludos.
elovan:
hola!!! ;) me parece excelente Tu aporte slo tengo duda en la parte del botn STOP :rolleyes2:
private void btnSTOP_Click(object sender, EventArgs e)
{
plotter1.Stop();
plotter2.Stop();
serialPort1.Close();
btnStart.Enabled = true;
btnSTOP.Enabled = false;
}
cual es la herramienta plotter1? no entiendo esa parte en mi compilacion me marca error en esas dos lineas!!
11/6/2014 PUERTO SERIAL Y C#
http://www.ucontrol.com.ar/forosmf/programacion-en-c-c-y-c/puerto-serial-y-c/?wap2 10/10
pero no c a que te refieras con plotter1 y plotter2,
entiendo que "lblCD" es una etiqueta pero no se que sea plotter, agradesco!! toda la informacin dada :smiley:
Mando31:
Comenta todas las lineas de Plotter, con eso debera de compilar, y dudo que washi_w_z_r te conteste ya que
es un post del 2009.
Cdigo:
private void btnSTOP_Click(object sender, EventArgs e)
{
//plotter1.Stop();
//plotter2.Stop();
serialPort1.Close();
btnStart.Enabled = true;
btnSTOP.Enabled = false;
}
Saludos.
elovan:
Gracias!!! todo funciona bien!!!, sabran de algn buen libro donde manejes C# y vision artificial?
Navegacin
[0] ndice de Mensajes

You might also like