La Web del Programador: Comunidad de Programadores
 
    Pregunta:  54087 - CONFIGURAR PUERTO SERIE EN C# PARA MODEN
Autor:  rodrigo rodriguez
Hola
Estoy relaizando mi tesis en ingenieria electronica, y conozco muy poco de C#....Necesito comunicar una aplicacion interfaz de usuario en C# con un MODEM de comunicaciones industriales HART. Este modem exige que los terminales del puerto serial funcionen asi:

TRASMITIENDO DATOS:
RTS=CTS=TRUE; DSR= DTR= TRUE

RECIBIENDO DATOS:
RTS=CTS=FALSE ; DSR=DTR= TRUE

Por favor si alguien tiene informacion o sabe donde puedo adquirirla,le agradecere infinitamente, pues como ya mencione no he podido comunicarme con el moden y soy principiante en esto de la programacion, y lo peor, ya estoyquedandome colgado en el cronograma de la tesis.
Gracias
RODRIGO

  Respuesta:  Rommel Meza
Que tal Rodrigo lo que necesitas es bastante sencillo ya que .Net 2.0 nos proporciona una clase para este tipo de control.

Primero necesitamos tener un compilador de .Net 2.0 ya sea Mono, C# Developer o Visual Studio 2005 ok.

Despues es muy sencillo el uso del objeto System.IO.Ports.SerialPort que esta diseƱado para hacer este tipo de trabajo, segun lo que escribes esto quedaria algo asi:

//Transmision de datos
System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort();
serialPort.PortName = "";
serialPort.RtsEnable = true; //Cambias para reception
serialPort.CtsHolding = true; //Cambias para recepcion
serialPort.DtrEnable = true;
serialPort.DsrHolding = true;

Como veo que cuando trasmites y cuando recibes cambias lo primero me imagino es enviar informacion al modem y cambias de estado para reception.

Para recibir datos es necesario asignar un delegado al evento DataReceived y podria quedar algo asi:

//Manejador del puerto
private System.IO.Ports.SerialPort serialPort;
//Delegado que nos ayudara a realizar el cambio de configuracion
private System.IO.Ports.SerialDataReceivedEventHandler manejador;

//Configuramos el puerto inicial
private void configuraPuert()
{
serialPort.PortName = "COM1";
this.manejador = new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
}

//Envia datos
private void enviaDatos(String _datos)
{
//Configura para envio
this.serialPort.RtsEnable = true;
this.serialPort.CtsHolding = true;
this.serialPort.DtrEnable = true;
this.serialPort.DsrHolding = true;
this.serialPort.Write(_datos); //Escribe datos

this.configuraRecepcion(); //Configuramos para recepcion
//Activamos el evento para recibir datos
this.serialPort.DataReceived += this.manejador;
}

//Configuramos modem para recepcion
private void configuraRecepcion()
{
this.serialPort.RtsEnable = false;
this.serialPort.CtsHolding = false;
}

//Evento que se ejecutara cuando se reciben los datos
void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
String result = this.serialPort.ReadExisting();
//Desactivamos el evento
this.serialPort.DataReceived -= this.manejador;
}

Espero te sirva de algo yo lo utilizo en algo parecido y me ha dado resultados si no mandame un Mail

Suerte :)