none
Leer Puerto COM1

    Question

  • Hola:
    Tengo un problema que  he dado vueltas. Estoy trabajando con Visual C++ y me gustaria saber como leer del puerto COM1 .Existe alguna clase en Visual Studio 2005?.
    La idea es que cada 10 segundos se le esta mandando datos al COM1 desde un microcontrolador. Y mi idea es tomar esos datos y ponerlos en una variable y asignarsela a otra y mostrarlo en un "form". Es posible hacer esto? O se debe leer desde algun archivo "dll" que maneja el microcontrolador? Es decir tengo que capturar los datos???


    Necesito alguna ayuda
    muchas gracias

    Fernando Fanti
    Monday, October 08, 2007 2:22 AM

Answers

  • El puerto serie es un recurso que no puede compartirse fisicamente. Por lo que si otra aplicacion lo tiene abierto no tienes posibilidad de usarlo. Eso no quita que puedas desarrollar una aplicacion que pueda soportar que varios clientes gestionando un puerto serie.

     

    Desde C++, puedes acceder al puerto serie utilizando el 'kernel32.dll' si estas desarrollando una aplicacion de codigo "no manejado" o 'System.IO.Ports' si es "manejado".

     

    No hay ningun problema procesar los datos que manda un controlador, pero si concretas mas quizas podamos encontrar algun ejemplo.

    Saludos,

    Pep Lluis,

     

     

    Monday, October 08, 2007 5:04 PM
  • Puedes utilizar SerialPorts el cual lo puedes encontrar en la ficha Componentes, a la misma se le establece la velocidad de la comunicación, bit de parada y paridad, entre otros. Yo la verdad que en c++.net no lo he utilizado pero si en vb.net, supongo que será igual.
    Suerte
    Monday, October 08, 2007 6:41 PM

All replies

  • Has probado con System.IO.Ports ???

     

    using namespace System::IO:Stick out tongueorts;

     

    Salu2

     

    Monday, October 08, 2007 7:11 AM
  • Gracias .Estare revisando.
    Tenia otra duda.
    Si un "programa  A "esta ocupando el puerto COM.
    Hay alguna forma de rescatar o leer esos datos del puerto  pero con otro "programa B"?


    Gracias por su ayuda
    Monday, October 08, 2007 8:02 AM
  • Si intentas abrir el puerto y ya está ocupado te saltará una excepción, podrías poner un programa interceptor de envío, tipo sniffer como BillSerialMonitor.

     

    Salu2

    Monday, October 08, 2007 8:08 AM
  • El puerto serie es un recurso que no puede compartirse fisicamente. Por lo que si otra aplicacion lo tiene abierto no tienes posibilidad de usarlo. Eso no quita que puedas desarrollar una aplicacion que pueda soportar que varios clientes gestionando un puerto serie.

     

    Desde C++, puedes acceder al puerto serie utilizando el 'kernel32.dll' si estas desarrollando una aplicacion de codigo "no manejado" o 'System.IO.Ports' si es "manejado".

     

    No hay ningun problema procesar los datos que manda un controlador, pero si concretas mas quizas podamos encontrar algun ejemplo.

    Saludos,

    Pep Lluis,

     

     

    Monday, October 08, 2007 5:04 PM
  • Puedes utilizar SerialPorts el cual lo puedes encontrar en la ficha Componentes, a la misma se le establece la velocidad de la comunicación, bit de parada y paridad, entre otros. Yo la verdad que en c++.net no lo he utilizado pero si en vb.net, supongo que será igual.
    Suerte
    Monday, October 08, 2007 6:41 PM
  • Hola Gracias a todos por responder.

    Me explico .
    El sistema tiene 3 cosas :
    - Lector de codigo de producto
    -Microcontrolador AVR
    -PC

    El microcontrolador lee codigos  (numeros de serie de productos) a traves de un lector y estos codigos los envia en forma serial al PC a un programa. Este programa muestra esos codigo o numero de serie y nada mas. No tengo el codigo fuente de ese programa.

    Mi idea es hacer algo simple. A medida que pasan los productos frente al lector de codigo  se guardan los datos de estos productos  en una lista o base de datos. 

    No tengo mucha idea de base de datos o SQL.Quizas ustedes sepan si se puede hacer una base de datos de forma muy simple de alguna otra forma.Quizas una lista de tamaño definido que se va llenando a medida que llegan los productos.Y mostrar algunos codigos en un label en un FORM

    El asunto es que los productos  llegan en cualquier momento .Es decir los numeros de serie ,pueden aparecer en cualquier  momento en el puerto COM. De algun modo tengo que leer esos codigos. No se como se pude manjear esto e ir llenando una lista si me van a llegar en forma aleatoria al COM
    Lei algo de que se puede dejar el programa blocked en espera de la llegada de datos seriales.

    Estoy trabajando con visual c++. Que me recomiendan ? Hacerlos por  Event driven programming ,blocking calls ,synchronization functions o  asinchronous IO ? Los ejemplo que he encontrado en el foro.No hay algo parecido y solo encuantro en C#. Sad Estoy recien empezando en este tema

    Les agradezco por sus orientadoras respuestas.
    saludos!




    Monday, October 08, 2007 6:45 PM
  • Hola Fernando yo he realizado algo parecido pero en vb.net, te comento un poco como funciona el puerto serie de la CP, es una pila o sea lo primero que llega es lo primero que se lee, el proceso de identificación de bytes validos de otros no validos lo realiza el mismo harware, y como si fuera poco tiene memoria, la cual se puede definir en Byte.
    ahora bien: la lectura la puedes hacer en cualquier momento ya que los datos no se forraran del buffer hasta que sean leídos, o bien que la pc se reinicie o apague, el orden en que los leas será igual al orden en que se hallan ingresado, para leerlos puedes usar un bucle, un timer, un hilo.
    el componente que he utilizado es el SerialPort.
    para que este funcione primero al iniciar tu aplicación tienes que abrir el puerto, esto lo que hace es activar el puerto para que escuche.
    esto se hace asi
    SerialPort1.Open()
    luego para  leer los valores del buffer es así
    SerialPort1.Read(unArray, 0, SerialPort1.BytesToRead)
    siendo unArray un array del tipo byte, 0 la posición del fufer en la que deseas comenzar la lectura, y SerialPort1.BytesToRead la cantidad de bytes a leer, en este caso he colocado que lea todos los bytes que posee el buffer
    luego para pasar el contenido a un label o etiqueta solo tienes que colocar
    label1.caption = unarray(pocicion del array a leer)
    el finalizar tu aplicación coloca
    SerialPort1.Close()
    espero que te sirva.



    Monday, October 08, 2007 7:27 PM
  • Hola  anonimus1818  le agradesco su mensage a mi me sirve , solo que tengo un problema que es, SerialPort1.BytesToRead me dice que es cero elementos a leer del buffer, cuando si le estoy enviando información.

     

    Pues tengo una función en una clase de vs2005 que envia comandos al puerto.

    me explico?.

     

    Cualquier sugerencia es de ayuda.

     

    Gracias

     

    Friday, February 01, 2008 7:01 PM
  • Bueno Lorena, primero tenés que tener en cuanta algunos detalles.

    Si desde una aplicación abriste el COM, esta es la única que podrá tener acceso, asta que sierres el COM y lo abras desde la otra aplicación, eso si no lo estas aciendo seguramente te dará algún error, yo la verdad que nunca lo probé dentro de un hilo pero en otros lenguajes si abrís el COM con un hilo desde otro no se puede tener acceso.

    Otra cosa es que si lo abrís con una configuración, e intentas leer los datos con otra, esto hará que te de el error que mencionas, me refiero a configuración a los bits de datos, bit de parada, bit de stop, etc.

    Y por ultimo y creo que este es el problema que tenes es que el buffer donde envías los datos no es el mismo que el que los recibe, si bien es el mimo puerto, pero no comparten la memoria.

    Para que te funcione vas a tener que meter mano en el harware de una manera muy simple el puerto com ablando de hardware se compone de un conector de 9 pines denominado DB9, en este hay 3 pines que son de mucha importancia ya que son la parte física que permiten una comunicación simple, estos pines son TX, RX y GND o Masa.

    TX es el pin que envía los datos

    RX es quien los recibe.

    GND es al referencia de tención si queres te lo explico pero para tu prueba no viene al caso.

    Bueno lo único que tenes que hacer es conectar el pin TX al RX esto hace que al enviar datos por TX se estén recibiendo por RX.

    TX y RX son los pines 2 y 3 del conector.

    Espero que entre tanto palabrerio puedas sacara algo en claro.
    Suerte
    Friday, February 01, 2008 7:32 PM
  • Hola a todos,me ha  servido de mucho sus comentarios, y les agradesco por ello.

     

    Saben resulta que tengo en una clase llamada Puerto el  proceso de la lectura del buffer, utilizando el evento

    DataReceived, entonces lo que estoy leyendo me lo esta guardando en un arreglo de byte, lo que quiero hacer es que ese arreglo pueda mostrarlo en un Formulario en una textbox, pues lo que hago es utilizar un arreglo de tipo publico para almacenar los datos, pero no me reconoce el arrego en el Formulario.

     

    Me explico?.

     

    Cualquier respuesta, me servira muchoo,

     

    De ante mano gracias.

    Wednesday, February 13, 2008 5:46 PM
  • Hola a todos, primero les agradesco mucho lo que el logrado aprender de sus respuestas.

     

    Ahora tengo una duda,lo que estoy haciendo es en una aplicación windows una clase llamada Puerto donde tengo el proceso de lectura de su buffer en el evento DataReceived , estos datos los guardo en un arreglo public de tipo byte, lo que quiero hacer es mostrar en un textbox de un formulario los datos del arreglo, al momento de querer utilizar el arreglo no lo reconoce en el Formulario, utilizo vs2005 en C#.

     

    Me explico?.

     

    De antemano muchas gracias.

     

     

    Wednesday, February 13, 2008 5:56 PM
  • Bueno me alegro que aya servido todo lo expuesto acá.
    El error que se te produce esta dado por querer acceder a un control creado fuera del sub proceso, o sea el DataReceived es un sub proceso dicho de otras palabras es un hilo.
    Una de las formas de solucionar el problema es por medio de una instrucción esta es:

    Control.CheckForIllegalCrossThreadCalls = False

    Lo bueno de esta instrucción es que el error no te figurará y lo que quieres hacer funcionara.
    lo malo es que en ocasiones puede presentarse fallas. Por que estas fallas?
    Buen la respuesta es por que estas en un sub proceso realizando una operación y en el medio de el lo envías a realizar otra acción por lo que, hay un tiempo en el que el sub proceso esta inactivo, por lo que perderás información, bueno eso dice la teoría.
    Yo lo he probado y con una cantidad bajo de datos funciona bien o sea si se le envian 3 o 4 bytes de datos, ahora si cada vez que le envíes datos excederá ese número deberás modificar el parámetro del serialport1.ReceivedBytesThreshold = XX
    siendo XX el Número de bytes que quieres recibir antes de que se dispare el sub proceso
    DataReceived
    La otra forma que es la forma correcta, creo que es una especie de semáforo lo que utiliza pero no te puedo ayudar en eso; esta en la ayuda del msdn, yo la verdad que no recuerdo donde.
    Bueno espero que esto te ayude un poco.
    Suerte

    Thursday, February 14, 2008 3:04 PM
  • Hola,

    no sé si ya hayas resuelto tu problema. Si trabajas con código nativo (i.e. no administrado), puedes echarle un vistazo a este artículo. Por cierto, siempre es bueno que menciones si trabajas con código administrado (aka C++/CLI o .NET) o no administrado (aka Nativo, ANSI C++ ó Win32).

    Saludos.
    Thursday, April 10, 2008 2:15 AM
  •  

    Hola soy lorena, gracias a estos foros ahorita puedo expresar esta duda que cualquier cosa en que me puedan ayudar, de antemano muchas gracias, la duda es:

     

    Estoy haciendo una comunicacion entre 2 puertos COM3 y COM4, utilizo 2 pantallas independientes,puesto que cada una se estara ejecutando en una pc distinta, donde desde una Envio datos del Puerto COM3, para que le puedan llagar al Puerto COM4, utilizo un cable para la comunicación.

     

    Cuando quiero leer el buffer del COM4, lo que el COM3 me envio, me dice que ByToRead =0.

     

    Primero ejecuto una forma donde le envio datos al COM4 por medio del COM3,,,, y despues ejecuto la otra forma donde leo el buffer del COM4.

     

    Saludos.

     

     

     

     

     

     

    Friday, April 11, 2008 10:56 PM
  • Hola Lorena,

    Primero debes tener en cuenta el tipo de cable que utilizas... si estas conectando puertos series de dos ordenadores, tienes que utilizar un cable cruzado :

     

    PC-A   PC-B

       2    -    3    (Rx de A con Tx del B)

       3    -    2    (Rx de B con Tx del A)

       5    -    5    (Comun o GND)

     

    En caso de que tengas el cable correctamente, mandame un trozido de de codigo para ver como lo estas haciendo.

    Pep Lluis,

    Espero tus noticias,

     

    PD. La otra prueba es hacer bucle en la salida para verificar que lo que estas mandando lo estas recibiendo.

     

    Monday, April 14, 2008 11:29 AM
  •  

    El cable tiene que ser null-moden si está de puerto a puerto, en relación a la anterior pregunra, a medida que se detectan códigos puedes activar una rutina con ese evento que añada registros a una base de datos access, por ejemplo o mejor a una SQL con SQL 2008 que tiene funciones nuevas de fecha y hora con lo que podrás realizar al tiempo un log de registro paralelo, etc. Saludos y espero haberte ayudado algo, al menos.
    Tuesday, April 15, 2008 8:14 PM
  • Hola:

    Puedes descargar el manual en pdf sobre VC++ y  puerto serie.
    Saludo.

    http://electronica-pic.blogspot.com
    Tuesday, May 26, 2009 9:47 PM