none
Puerto Serial

    Question

  • Hola a todos, tengo una duda sobre el manejo del puerto serial, desarrollo en C#2008, necesito saber como enviar voltaje por el puerto serial, que cantidad puedo enviar y como lo hago.

    De antemano gracias.
    Tuesday, April 21, 2009 11:25 PM

Answers

  • No puedes enviar voltaje (si creo haberte entendido) por un puerto serie, sólo unos y ceros y bajo un estricto protocolo definido por la electrónica.

    Existen dos tipos de puerto serie en cuanto al voltaje en que trabajan, los RS232 TTL que van a 5V y que en general sólo hay a nivel industrial (aparatos industriales y no domésticos) y los que van a 12V, que son los de los PC y los módems. Existen chips para adaptar uno a otro (los famosos MAX 232, pero hay más) ya que no se pueden conectar directamente, y si lo haces corres el riesgo de romperlos y si no se rompen seguro que no funcionan.

    Como norma general, sólo se pueden enviar bytes de 9, 8 ó 7 bits a una gama de velocidades predefinidas y bajo unas estrictas normas de protocolo (bits de start, bits de stop, paridad), y de ahí uno no se puede salir, no al menos con el nombre de RS232.

    Para enviar diferentes niveles de voltaje necesitas un conversor digital-analógico, que básicamente transforma un número binario en un voltaje equivalente, pero el PC no trae nada de eso y debe hacerse con placas especiales. Por ejemplo, una placa conectada al puerto serie o al paralelo que convierta el byte recibido en nivel de tensión, a veces mediante un protocolo de comunicaciones específico (no sólo enviando un número) ya que esas placas suelen tener varios conversores y más cosas, como puertos de E/S. Un par de ejemplos, uno propietario y otro estrictamente Open Source:

    http://www.heber.co.uk/content.php?page=xline

    http://www.opencockpits.com/catalog/tarjetas-electronicas-iocards-c-21.html
    Wednesday, April 22, 2009 8:44 AM
  • Si lo hubieras presentado así desde el primer momento...

    Lo que quieres es una apertura de cajón por puerto serie. Eso lo traen muchas impresoras por defecto, sobre todo aquellas que imprimen tickets como las registradoras. Estoy casi seguro que si estás usando una impresora de tickets tiene eso. Míralo o ponme el modelo. Y entonces abrir el cajón es tan sencillo como enviar una cadena que debe estar en la documentación de la impresora.

    Por otro lado, lo que te han dicho en la tienda es correcto. El MAX-232 convierte y procesa la señal de 12V a TTL y te sirve mayormente de buffer para no romper el puerto RS232 del PC en alguna contingencia. Luego tomas el pin RX del lado TTL y lo atacas a la base de un transistor que a su vex atacará la bobina del relé (si quieres, también podría hacerse directamente sin relé poniendo un darlington de potencia o un MOSFET). Como los puertos trabajan con lógica negativa (están a 5V y cuando envías un 1 pasan a 0V, posiblemente necesites elementos PNP en lugar de NPN, pero ya no lo tengo claro).

    Aparte de todo eso necesitas hacer los cálculos pertinentes para que el circuito funcione, cálculo de potencias y de resistenicas, etc.

    Luego sólo tienes que enviar un número por el puerto serie (te aconsejo un byte todo a unos, 0xff), y el cajón se abrirá.

    De todos modos dime si lo de la impresora no es así y probaré a ver si los chatarrilas de mi empresa están por la labor...
    Friday, April 24, 2009 8:22 AM

All replies

  • No puedes enviar voltaje (si creo haberte entendido) por un puerto serie, sólo unos y ceros y bajo un estricto protocolo definido por la electrónica.

    Existen dos tipos de puerto serie en cuanto al voltaje en que trabajan, los RS232 TTL que van a 5V y que en general sólo hay a nivel industrial (aparatos industriales y no domésticos) y los que van a 12V, que son los de los PC y los módems. Existen chips para adaptar uno a otro (los famosos MAX 232, pero hay más) ya que no se pueden conectar directamente, y si lo haces corres el riesgo de romperlos y si no se rompen seguro que no funcionan.

    Como norma general, sólo se pueden enviar bytes de 9, 8 ó 7 bits a una gama de velocidades predefinidas y bajo unas estrictas normas de protocolo (bits de start, bits de stop, paridad), y de ahí uno no se puede salir, no al menos con el nombre de RS232.

    Para enviar diferentes niveles de voltaje necesitas un conversor digital-analógico, que básicamente transforma un número binario en un voltaje equivalente, pero el PC no trae nada de eso y debe hacerse con placas especiales. Por ejemplo, una placa conectada al puerto serie o al paralelo que convierta el byte recibido en nivel de tensión, a veces mediante un protocolo de comunicaciones específico (no sólo enviando un número) ya que esas placas suelen tener varios conversores y más cosas, como puertos de E/S. Un par de ejemplos, uno propietario y otro estrictamente Open Source:

    http://www.heber.co.uk/content.php?page=xline

    http://www.opencockpits.com/catalog/tarjetas-electronicas-iocards-c-21.html
    Wednesday, April 22, 2009 8:44 AM
  • Ok, esto es lo que entiendo:  Por el puerto serial yo mando una serie de bytes a cierta velocidad y siguiendo los protocolos definidos, a mi puerto serial puedo conectar un circuito que reciba esta serie de bytes y los interprete para poder generar voltaje, con algun convertidor o algo por el estilo.

    Gracias RFOG por tu tiempo.
    Wednesday, April 22, 2009 5:04 PM
  • RFOG experto en puertos seriales ;)


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    Thursday, April 23, 2009 3:27 PM
  • Exactamente.

    Ese circuito necesitará algún tipo de Latch o Báscula que vaya pasando los bits de serie a paralelo, y una vez obtenido ese paralelo pasarlo a un DAC para convertir ese número en un valor analógico, que a su vez atacará a un MOSFET (un tipo de transistor controlador de tensión) o similar y ahí tendrás el resultado. Otra opción es cogerte una FPGA (una especie de chip "en blanco" que permite grabarle un "programa de electrónica") o similar y grabarte toda esa circuitería. O lo mismo ya hay chips que lo hacen directamente.

    Más no te puedo decir porque mi electrónica data de los años 80 y ahora, cuando necesito algo de eso, me lo hacen y lo uso.

    De todos modos, lo que tu quieres es exactamente eso:
    http://www.laurels.com/transmitter-serial2analog.htm
    Thursday, April 23, 2009 9:48 PM
  • Si yo te contara... Industrialmente las comunicaciones entre periféricos o entre periférico y ordenador (incluyendo autómatas, sistemas scada...) se realizan a través de protocolos serie, y de hecho mi trabajo tiene un componente de más del 50% en relación a la "comunicación serie"... y casi el otro 50% a la "comunicación paralelo".

    :-P
    Thursday, April 23, 2009 9:52 PM
  • Te agradezco la atencion que me has prestado, eh investigado con todo lo que me comentas, sigo atorado con la contruccion del circuito. Te comento exactamente lo que necesito y dime si lo puedo hacer o no, tengo un sistema el cual necesita abrir un cajon el cual a su vez se abre con 12 V ya lo proble y le mando 12v y se abre facil y rapido el problema es que mi sistema tiene que controlar esos 12V.....Necesito hacer el circuito interfaz entre mis señales del puerto serie y ese cajon, el problema es que no se ni como ni  nada, fui a un lugar en mi ciudad en donde venden estas cosas de electronica, el tipo de la tienda me dijo mira: Este es el MAX 232 lo conectas al puerto serial y las salidas a este Relevador de 12V el relevador lo conectas al cajon y listo....WOHA....que maravilla dije yo, pero segui investigando y sigo sin dar como armar el circuito para que funcione......Igual esto es sencillo o irrelevante pero tengo proyectos en STOP que necesito sacar adelante..... al hacer esto resuelvo como otros 6 problemas que tienen la misma base....Como hacer que mi puerto serial controle 12 V ......Gracias por todo Muchas gracias de verdad.
    Thursday, April 23, 2009 10:04 PM
  • Si lo hubieras presentado así desde el primer momento...

    Lo que quieres es una apertura de cajón por puerto serie. Eso lo traen muchas impresoras por defecto, sobre todo aquellas que imprimen tickets como las registradoras. Estoy casi seguro que si estás usando una impresora de tickets tiene eso. Míralo o ponme el modelo. Y entonces abrir el cajón es tan sencillo como enviar una cadena que debe estar en la documentación de la impresora.

    Por otro lado, lo que te han dicho en la tienda es correcto. El MAX-232 convierte y procesa la señal de 12V a TTL y te sirve mayormente de buffer para no romper el puerto RS232 del PC en alguna contingencia. Luego tomas el pin RX del lado TTL y lo atacas a la base de un transistor que a su vex atacará la bobina del relé (si quieres, también podría hacerse directamente sin relé poniendo un darlington de potencia o un MOSFET). Como los puertos trabajan con lógica negativa (están a 5V y cuando envías un 1 pasan a 0V, posiblemente necesites elementos PNP en lugar de NPN, pero ya no lo tengo claro).

    Aparte de todo eso necesitas hacer los cálculos pertinentes para que el circuito funcione, cálculo de potencias y de resistenicas, etc.

    Luego sólo tienes que enviar un número por el puerto serie (te aconsejo un byte todo a unos, 0xff), y el cajón se abrirá.

    De todos modos dime si lo de la impresora no es así y probaré a ver si los chatarrilas de mi empresa están por la labor...
    Friday, April 24, 2009 8:22 AM
  • Friday, April 24, 2009 11:02 AM
  • Creo que te debo una disculpa por no haber planteado las cosas como eran desde el principio, lo hice para ver si obtenia una respuesta general ya que aparte del cajon tengo chapas que tambien trabajan con 12V y mis sistemas necesitan abrirlas asi que si resolvia lo de los 12V era para mi una solucion "Global" claro con las adecuaciones pertinentes pero sobre una base solida, lo que mencionas del cajon es completamente cierto, las impresoras de tickets traen ya un puerto que controla la apertura del mismo, PERO...... la gente con la que estoy trabajando no quiere comprarse una impresora de tickets....asi que le toca al "Programador" Crear la Solución y por eso ando atorado con esto, lo del MAX 232 no lo tengo claro, creo que este foro cubre la cuestion de la programacion del serial pero no se si aqui mismo pudieran auxiliarme en la cuestion electronica?????, si sabes algo te lo agradeceria.

    De antemano gracias.
    Friday, April 24, 2009 6:35 PM
  • Tuesday, May 26, 2009 10:08 PM
  • En realidad se pueden cambiar las salidas de tres pines en un puerto serie RS232, quiero decir cambiar su voltaje de -10 a +10 aproximadamente y al revés, estos pines son RTS, DTR y TX, también se puede trasmitir datos y es su función principal como se dice en el foro pero no la única, de hecho hay muchas aplicaciones en la que se usan de manera indistinta para activar mecanismos, para lograrlo se hace necesario manipular y configurar la UART del puerto, esto no es fácil pero teniendo ya escritos los códigos se pueden adaptar a cualquier programa, en este enlace http://www.megaupload.com/?d=DEUNDQ5G tengo escrito desde hace muchos años un código en TC que se puede integrar por partes en C++ y que sirve para probar puertos, para hacer el cable de prueba se unen los pines como marca el esquema del código.
    No se si se puede hacer en C# porque no lo conozco bien todavía, pero también tienes que saber que las salidas del puerto tienen muy poca capacidad de corriente por lo que se hace necesario agregar un opto acoplador o un mosfet o cualquier elemento que transforme un cambio de potencial en la actuación de un mecanismo.
    Si quieres saber mas sobre las UART te dejo el enlace, la mas usada actualmente es la 16550 pero si te aprendes la 8250 es casi lo mismo, saludos.

    http://todohard.awardspace.com/tutrs232/

    PD, NO SE SI SE PUEDE PEGAR EL CÓDIGO POR ESTE MEDIO PORQUE OCUPA VARIAS PÁGINAS PERO SI NO PUEDES BAJAR EL ENLACE LO INTENTO.

    Friday, June 05, 2009 7:30 PM
  • Si me das tiempo te mando el circuito, lo que me tienes que decir es que corriente consume el cajón, ya se que trabaja a 12 V pero me tienes que decir también si es corriente contínua o alterna.
    Probablemente si puedes hacer un programa en C# y habres el puerto luego puedes cambiar la propiedad del pin RTS con lo que tendrás la solución si usas ese pin, yo no te lo hago porque no se todavía como programar puertos en ese lenguaje aunque lo estoy estudiando, si alguien en el foro puede subir el código se lo agradezco de ante mano, saludos.

    Saturday, June 06, 2009 8:00 AM
  • A ver, un poco de agua fría en todo esto.

    Todo eso que comentáis de controlar directamente la UART etc, desde la época de Windows NT NO SE PUEDE HACER sin un driver de bajo nivel que lo permita. Eso se pudo hacer en Windows 95/98 porque éste tenía una máquina DOS nativa oculta y cuando se hacía una petición de bajo nivel Windows la redireccionaba por temas de compatibilidad.

    Es decir, cualquier código hecho en Turbo C no va a funcionar. Ni en los Microsoft C++ de 16 bits de la época. Ni en los Borand C++ para MS-DOS, ni en los Microsoft C++ para DOS. Ni en el Watcom con extender para DOS ejecutando bajo un Windows.

    Y menos aun desde C#.

    Pero bueno, probad.
    Saturday, June 06, 2009 8:58 AM
  • A ver, un poco de agua fría en todo esto.

    Todo eso que comentáis de controlar directamente la UART etc, desde la época de Windows NT NO SE PUEDE HACER sin un driver de bajo nivel que lo permita. Eso se pudo hacer en Windows 95/98 porque éste tenía una máquina DOS nativa oculta y cuando se hacía una petición de bajo nivel Windows la redireccionaba por temas de compatibilidad.

    Es decir, cualquier código hecho en Turbo C no va a funcionar. Ni en los Microsoft C++ de 16 bits de la época. Ni en los Borand C++ para MS-DOS, ni en los Microsoft C++ para DOS. Ni en el Watcom con extender para DOS ejecutando bajo un Windows.

    Y menos aun desde C#.

    Pero bueno, probad.

    Justo cuando recibo tu mensaje había terminado el proyecto en C# y funciona perfectamente, el código básico es:
    se puede bajar completo de: http://www.megaupload.com/?d=I4KR63BW

    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.Ports;

    namespace

     

    PicRS232

    {

     

    public partial class Form1_Principal : Form

    {

     

    public Form1_Principal()

    {

    InitializeComponent();

     

    // Abrir puerto mientra se ejecute la aplicaci¢n

     

    if (!serialPort1.IsOpen)

    {

     

    try

    {

    serialPort1.Open();

    }

     

    catch (System.Exception ex)

    {

     

    MessageBox.Show(ex.ToString());

    }

    }

    }

     

     

    private void button_a_Click(object sender, EventArgs e)

    {

     

    if (pictureBox2.Visible == false)

    {

    pictureBox2.Visible =

    true;

    serialPort1.RtsEnable =

    true;

    }

     

    else

    {

    pictureBox2.Visible =

    false;

    serialPort1.RtsEnable =

    false;

    }

    }

     

    }

    }

    Saturday, June 06, 2009 11:22 AM
  • Muy bonito, pero eso forma parte de una comunicación dentro de un protocolo... Tu no puedes bajar CTS o subir RTS o cambiar el estado de TX... Tendrás que iniciar el envío de un byte... Claro que esas señales suben y bajano, pero no de forma independiente, sino a causa del protocolo...
    Saturday, June 06, 2009 5:33 PM
  • Si lees mi mensaje antes del que enviaste con agua fria verás que ya proponía la solución que finalmente di y como sea es una solución que sirve y no hace falta enviar ningun byte, porque como tu sabes el protocolo al que te refieres consiste entre otras cosas en darle a la UART los valores necesarios en sus registros para que funcione de un determinado modo y no exigen el envio de nada, por otro lado estoy convencido que se pueden enviar estos valores al puerto sin usar las herramientas comunes de los compiladores de lenguajes superiores, hechas para facilidad y beneficio del uso en comunicaciones, pero como dije los puertos RS232 se usan muchas veces de modo diferente y lo se porque he tenido que programar protocolos a nivel intermedio como bien has dicho muchas veces en mi trabajo.
    Estoy seguro que si conocieras a fondo una UART con todo lo que sabes la harías funcionar con tus propios protocolos, yo espero hacerlo con el tiempo usando algunos de los programas Express que nos da Microsoft y que agradezco, cuando lo haga te lo haré saber, saludos.

    PD el programa en TC que hice hace 15 años y que puedes bajar de http://www.megaupload.com/?d=DEUNDQ5G, (funciona en una ventana DOS de cualquier Windows actual), puede cambiar el estado de TX o RTS, en cuanto al CTS no porque es entrante, pero si te refieres a enviar datos por RTS y recibirlos por CTS, con tiempo se puede preparar, al principio el uso de los terminales de las UARTs se asignaban por protocolo y se podía transmitir por cualquier salida y recibir por cualquier entrada del puerto, la asignación de los terminales las dió el uso generalizado y finalmente por convención.

    Saturday, June 06, 2009 8:59 PM