Principales Mandatos para utilizar el Puerto Serie, del espacio System.IO.Ports

Estos son los mandatos e instrucciones mas frecuentes para utilizar el puerto serie:

 

' Principales mandatos para utilizar el puerto serie:
Serie = My.Computer.Ports.OpenSerialPort("COM1")  'Constructor
'
'Definir las características de la comunicación
Serie.BaudRate = 19200        'velocidad de comunicaciones
Serie.DataBits = 8            'Longitud para Byte de datos
Serie.Parity = Parity.Even    'paridad(enumeracion parity)
Serie.StopBits = StopBits.Two 'Bits parada después datos
'
'Abrir/Control/Liberar Puerto
Serie.Open()            'Abrir el puerto Serie
Serie.Close()           'Cerrar el Puerto Serie
Serie.Dispose()         'Liberar objecto
Dim SiNo As Integer
SiNo = Serie.IsOpen     'El Puerto esta abierto?
Dim Puerto As String
Puerto = Serie.PortName 'Nombre del puerto
'
'Manejo y Control de señales
Dim Estado As Boolean     'True=Activa / False=Inactiva
Estado = Serie.CDHolding  'Estado de la señal carrier detect
Estado = Serie.CtsHolding 'Señal Clear to Send
Estado = Serie.DsrHolding 'Señal Data Set Ready
Serie.DtrEnable = True    'Activar de Data Terminal Ready
Serie.RtsEnable = True    'Activar Request To Send
'
'Control Transmission/Recepcion
Serie.ReadBufferSize = 1024  'Definir tamaño buffer recepcion
Serie.WriteBufferSize = 1024 'Definir tamaño buffer envio
Serie.ReadTimeout = 10       'Fuera de tiempo en receción
Serie.WriteTimeout = 10      'Fuera de tiempo en transmisión
Serie.Handshake = Handshake.XOnXOff 'Control recepcion/envio
Serie.DiscardInBuffer()             'Borrar buffer de entrada
Serie.DiscardOutBuffer()            'Borrar buffer de salida
'
'Enviar datos
Contador = Serie.BytesToWrite 'Bytes en espera de ser escritos
Serie.Write("Hola Mundo")     'Enviar una cadena de caracteres
Serie.WriteLine("Hola Mundo"'Enviar una linea
'
'Leer datos
Dim Contador as Integer
Contador = Serie.BytesToRead  'Bytes en espera de ser leidos
Serie.ReadByte()              'Leer un byte
Serie.ReadChar()              'Leer un char
Serie.ReadLine()              'Leer una linea
Serie.ReadExisting()          'Leer datos existentes en buffer
PepLluis :-)

Saludos,
Pep Lluis

 

 

99 pensamientos en “Principales Mandatos para utilizar el Puerto Serie, del espacio System.IO.Ports”

  1. hola que tal estoy tratando de hacer una aplicacion de un medidor de energia electrica, y tiene un puerto rs485 y tengo que presentarlo en pantalla y no sepor donde empezar me gustaria que me ayudaras…gracias

    taz_ues@hotmail.com

  2. Hola Luis,
    Al igual que nuestro anterior compañero, te invito a enviarme tu peticion a traves del correo, puedes usar la opcion ‘contact’ en el recuadro ‘This Blog’ arriba a la izquierda.

    Espero tus noticias, asi como tambien espero poderte ayudar.

  3. Estoy creando una aplicación en vb.net…La misma estará corriendo en 3 PC…una de estas Pc tendrá la base datos…Entonces, el problema es: Cómo hago que cada aplicación guarde la ruta de la base de datos….
    Me explico mejor: en vez de fijar una ruta en el codigo, fijarla despues que la aplicación esté lista, es decir, buscar la ubicacion de la bd mediante un dialogbox por ejemplo…DE ANTEMANO gracias………

  4. Hola rodi… este post es sobre el espacio de nombres de System.IO.ports si te parece contacta conmigo para discutir esta question o bien puedes postear en los blogs de MSDN, donde bien seguro podemos ayudarte.
    Saludos,
    Pep Lluis,

  5. Tengo problemas con la recepcion de datos. Estoy utilizando el io.ports.serialport definido con withEvents, pero no puedo recibir ningun dato. Sin embargo, dentro de la subrutina de escrituta he incluido un pequeño bloque de lectura que utiliza puerto.readExisting y recibe informacion basica, pero la info importante no aparece. Todo funciona muy bien desde la hyperterminal. Ayudame con la recepcion de datos. Te lo agradecere toda la vida

  6. Patricio, Mandame un ejemplo de codigo para poder indicarme sobre el mismo. Puedes hacerlo en la opcion [This Blog] [Contact] – (Parte superior a la Derecha). Saludos, Pep Lluis,

  7. Hola Luis, estoi haciendo mi proyecto de titulo, y necesito enviar datos a traves del puerto serie con una pantalla en visual basic; dichos datos deben ser adquiridos por un basic stamp para controlar unos servomotores, necesito ayuda ya que me queda super poco tiempo para poder entregar mi tesis, esperando una pronta respuesta se despide Elias M.

  8. Elias,

    Mandame una descripcion mas detallada y el codigo que tengas, para poder indicarme sobre el mismo. Puedes hacerlo en la opcion [This Blog] [Contact] – (Parte superior a la Derecha). Saludos, Pep Lluis,

    Te Contestare tan pronto como me sea posible.

    Saludos,

    Pep Lluis,

  9. TEngo una impresora de ticket en puerto com1 pero al parecer no logra conectarse via com, por que el error me dice que el nombre no existe o no esta asiganado

  10. Debes dirigirte a :
    MiPc>Administrar>Administrador de dispositivos>Puertos(Com & LPT)
    En el veras una enumeracion de los puertos disponibles, luego solo tienes que utilizar uno de ellos para conectar la impresora y efectuar sobre el mismo la instruccion de Open.

    Saludos,
    Pep Lluis,

  11. Gracias Juan Carlos por tus amables palabras… pero creo que en mi caso no es por listo, si no mas bien por viejo. No hay duda que el conocimiento y la experiencia se adquieren con los años por lo que mi formula es muy sencilla, el problema es que algunos necesitamos 30 años para saber lo poco que sabemos, la suerte es que lo mas jovenes teneis mas facilidad por lo que provablemente en menos tiempo tendreis el mismo conocimiento, solo es cuestion de mantener despierta la curiosidad por aprender.

    Saludos,
    Pep Lluis,

  12. Hola!, muhcas gracias por tomarte el tiempo de dar aconcoer estos datos.
    Mira yo estoy tratando de hacer una aplicación uqe lea el número telefónico de una llamada entrante por un modem con vb.net 2005 pero no logro entender como «cachar» cuando entre la llamada, entiendo que esto va en el evento datareceived, encontre este codigo, pero es en C y no se como traducirlo a vb y lo peor de todo no se en que parte de todo el código va:
    this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.Recepcion);
    Agradezco de antemano tu ayuda

  13. Gracias por tu amabilidad.

    Debo confesarte que los Modems que utilice en su momento no disponian de informacion documentada sobre comandos AT o registros que suministren esa informacion. Quizas algun modem de los incorporados en GPS, ISDN o tecnologias mas actuales lo permiten… pero lo desconozco. En todo caso si dispones de esa informacion deberias decirme el formato e intentamos ver como aplicamos un ejemplo para VB.NET.

    Recuerdo que la unica informacion que suministran los Modems antiguos es un enviar por el TX del rs232 un simple «ring» cuando reciben señal por el pin nº9 asi el programa puede mandar un ATH0 .. creo? para descolgar y efectuar la conexion.

    Saludos,
    Pep Lluis,

  14. hola sabes tengo un proyecto de hacer una interface por medio de vb.net de hacer funcionar una licuadora y cambiar las velocidades la interfaz ya la tengo el problema es el programa como lo hago

  15. Hola Victor,
    Que fuerte!!… una licuadora… deberias explicarme el interface con mas detalle, para entender el protocolo y pensar en una idea para mandar las velocidades.
    Contacta explicando con mayor detalle a traves de [This Blog] [Contact]
    Saludos,

    1. Para controlar las velocidades yo habria puesto un decodificador Serie a paralelo de tal manera que al enviar cierto dato por el puerto se decodifique y active un «1» a la salida del deco, y de ahi con un TRIAC activo las velocidades de cada velocidad o bien con el mismo TRIAC mediante PWM proveemos las velocidades desde VB, me habria encantado poder ayudarles con ese proyecto. Saludos.

  16. Hola buenas tardes muy buena la informacion del blog, Estoy haciendo un proyecto que se basa en controlar los servicios de una casa a traves de la pc ( es una maqueta de una casa montada sobre un circuito) los dos servicios que quiero manejar es el encendido y apagado de las luces, y el abrir y cerrar puertas, ya tengo el circuito montado y el pic programado, lo que falta es enviar la señal desde el programa diseñado en .net… quisiera que me orientaras para ver como lo puedo hacer…. agradezco de antemano tu ayuda..

    Saludos,
    Deisy

  17. Hola Seisy,
    El programa del PIC debe incluir una parte de electronica que debes enlazar a traves de USB o RS232, luego debes incluir en tu programa las funciones de Lectura/Escritura que atiendan las ordenes enviadas por el PC, usando System.IO.Ports por ejemplo.
    Debido a lo extenso del tema, como a otro tipo de consultas similares te invito a contactar directamente para continuar la conversacion.
    Puedes usar la opcion [This Blog][Contact]
    Saludos y gracias por valorar positivamente la informacion de este Blog.
    Pep Lluis,

  18. Hola Pep Lluis!
    Estoy nueva en esto pero ya hice el programa para leer el puerto serial… ahora tengo un prolema, el computador q los envia, lo hace por com1 (no se puede cambiar) y la pc q los recibe (donde tengo el programa en visual studio 2005) lo hace por com4.. resulta q cuando lo quiero ejecutar me dice COM1 NO EXISTE… no se si debo hacer una rutina donde le diga q lea por calquier puerto (de ser asi, si puedes ayudame) o hay otra forma de hacerlo!

    Gracias..!

  19. Hola Karina!
    Bueno simplemente en el programa debes dejar libre la seleccion del puerto, para que dependiendo del computador puedas selecionar el ‘open’ en COM1 o COM4. aunque para entender mejor tu caso deberia conocer mas detalles de tu proyecto. Si lo crees oportuno contacta a traves del Blog y continuamos la conversacion en privado.
    Puedes descargarte mi libro que introduce a las comunicaciones serie en :
    http://www.dotnetmania.com/Libros/CTdnm01/Robot%20dispensador%20para%20MSDN%20Vídeo.pdf
    Precisamente la pagina 32/33 te dice como resolver una situacion como la tuya.
    Espero saber como te ha ido.
    Sadudos,
    Pep Lluis,

  20. Hola,
    Al ajecutar .IsOpen en una función me dice que el puerto está cerrado, y al intentar cerrarlo con .Close me dice que el puerto ya se encuentra cerrado y sale por error. Esto no me sucede en todas las máquinas. Tenés idea que puede ser?
    Saludos

  21. Hola Federico,

    Bueno creo que la situacion es logica, si el puerto esta cerrado ‘IsOpen’ te devolvera ‘false’ y evidentemente una operacion de ‘Close’ generara una excepcion.

    Aunque puedes resolverlo simplemente con :

    If

    MiSerialPort.IsOpen Then MiSerialPort.Close()

    Si te parece puedes contactar directamente conmigo desde la opcion [Contact] al inicio del blog, o bien concreta la pregunta o el problema en los Foros de MSDN, estare atento para ofrecerte ayuda.

    Saludos,

    Pep Lluis,

  22. Hola solo queria decirles si me podian ayudar con el SerialPuert1. es k lo que pasa k estoy en desarrollo de un proyecto de un brazo robotico iap diseñe el brazo y el circuito y pues el entorno grafico en visual Express con entorno flash para la posicion de angulos de mi brazo ahora solo quiero saber como activar el puerto y mandar valores en BINARIO..si me pueden ayudar les agradeseria mucho bueno aki les dejo mi correo Dare_devil664@hotmail.com ahi me pueden mandar el codigo gracias…

  23. Hola,

    he realizado un programa en VS 2005 que debe imprimir un ticket en una impresora de ticket, cuando quiero sacar el ticket mando el informe a la impresora de ticket directamente y así no sale lo de elegir impresora, esto en mi equipo sale perfecto con una impresora normal, pero llego al equipo del cliente y el ticket sale en pantalla.

    puede alguien ayudarme con este tema. muchas gracias de antemano.

  24. Hola Andres,
    A falta de conocer detalles sobre el equipo del cliente, deberias verificar que impresora tienes seleccionada como predeterminada en el sistema. desde Inicio>panel de control>impresoras
    Saludos,

  25. Que Tal PepLluis, (primero que nada mucho gusto y ojala y me puedas echar una mano o darme un norte de que me esta faltando, gracias.).
    Sucede que estoy desarrollando una aplicacion de ventas en PDA y mando a imprimir a una impresora Termica Zebra MZ220 la cual utiliza CPCL, (tengo el manual de Zebra y el codigo no me parece complejo), inclusive en Zebra solo me han dicho abre el puerto serial y manda a escribir en codigo CPCL, hasta ahi no hay problema. El problema comienza cuando envio la primer linea PS.write(«[TEXTO]») es cuando me egresa un error en VB (se ve que la impresora comienza a recibir pero no pasa nada mas), te adjunto mi codigo y el error y ojala y me puedas decir que estoy haciendo mal gracias.

    CODIGO
    Imports System
    Imports System.IO.Ports
    Imports System.IO

    Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ps As New System.IO.Ports.SerialPort(«COM3», 9600, Parity.None, 8, StopBits.One)
    Try
    ps.Open()
    ps.Write(«! 0 200 200 210 1» + vbCrLf + «TEXT 4 0 30 40 Gracias Dios» + vbCrLf + «FORM» + vbCrLf + «PRINT»)
    ps.Close()
    Catch ex As Exception
    MsgBox(«ojo » & ex.ToString)
    ps.Close()
    End Try
    End Sub

    End Class

    ERROR
    System.IO.IOException: IOException
    en System.IO.Ports.SerialStream.WinIOError()
    en System.IO.Ports.SerialStream.Write(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
    en System.IO.Ports.SerialPort.Write(String text)
    en SmartDeviceProject3.Form1.Button1_Click(Object sender, EventArgs e)
    en System.Windows.Forms.Control.OnClick(EventArgs e)
    en System.Windows.Forms.Button.OnClick(EventArgs e)
    en System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
    en System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
    en Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
    en System.Windows.Forms.Application.Run(Form fm)
    en SmartDeviceProject3.Form1.Main()

    Gracias

  26. Hola Ivan,
    Por el codigo te aconsejaria que omitiras la instruccion de ps.close, pues es posible que al ejecutarlo estan interrumpiendo el envio completo de la trama y supongo que el error viene dado por esa ‘interrupcion forzada’ cuando esta procesando el buffer de transmision.

    Espero que la intuicion sea buena… ya nos contaras.
    Pep Lluis,

  27. Muchas gracias por responder tan pronto Peplluis, he comentado la linea ps.close e incluso la comento en la parte del catch, sin embargo me regresa el mismo error; no se si olvide comentarte el medio de impresion es IRDA y le estoy poniendo los mismos datos de configuracion del puerto (9600,N,8,1), ¿Tienes alguna otra idea? Gracias

  28. Ivan,
    Pues ocurre como bien sabes que los IRDA son un mundo aparte. Lo ideal es Virtualizar un COM a traves de bluetooth. La unica cosa que se me ocurre es que ajustes la velocidad lo mas baja posible a 1200 o 2400 bauds por ejemplo. Deberias probar enviando un texto ASCII puro y sin caracteres de control tipo VbCrLF…. Si te parece continuamos esta conversacion en privado, contactame a traves de la opcion [Contact] en el inicio del Blog.
    Saludos,
    Pep Lluis,

  29. Hola Enrique,

    En el siguiente enlace tienes un ejemplo que podrias utilizar como punto de partida.

    http://msmvps.com/blogs/peplluis/archive/2008/09/19/leer-los-ceros-y-unos-de-un-micro-controlador.aspx

    Lo unico que tienes que cambiar es la incorporacion de los bytes recibidos por un contenedor de texto tal como rtf. Luego tienes que tener en cuenta escoger un juego de caracteres que te permita representar los caracteres de control.

    Si quieres podemos continuar la conversacion contactandome a traves de la opcion al inicio del blog [contact]

  30. hola….

    soy estudiante de mecatronica y me gustaria que me ayudaras para un proyecto de creatividad lo que necesito es controlar un motor por el puerto paralelo en visual basic 2005 que con un botton se encienda y a cierto tiempo de vuelta atras… mi correo es misterios_gol@hotmail.com la vdd que te lo agradeceria

  31. Hola..Pep Lluis tu foro es muy bueno y tiene las cosas especificas que uno pueda buscar, creo que como todos estoy agradecido por el aporte de tus conocimientos hacia los demas…te escribo para pedirte porfavor si me puedes hechar una mano si no son las dos =) al problema que tengo.

    Tengo que hacer un programa en VS 2005 para recibir datos de una balanza electronica en tiempo real y copie de aqui parte del codigo y otra parte que encontre en MSD con lo que consegui hacer este metodo

    Function ReceiveSerialData() As String
    ‘ Receive strings from a serial port.
    Dim returnStr As String = «»

    Using serie As IO.Ports.SerialPort = _
    My.Computer.Ports.OpenSerialPort(«COM1»)

    serie.BaudRate = 9600

    serie.DataBits = 7

    serie.Parity = Parity.Even

    serie.StopBits = StopBits.One

    Do
    Dim Incoming As String = serie.ReadLine()
    If Incoming Is Nothing Then
    Exit Do
    Else
    returnStr &= Incoming & vbCrLf
    End If
    Loop
    serie.Close()
    End Using

    Return returnStr
    End Function

    Al metodo lo llamo en el evento click d un boton y cuando lo hago solo consigo que la aplicacion se cuelge, no se que me podrias decir de aque se debe. Gracias de antemano

  32. Hola Leo,
    En primer lugar nunca deberiamos utilizar un Do-Loop dentro de una rutina de recepcion de datos. En segundo lugar si utilizas un ‘ReadLine’ deberias hacerlo desde un ‘Threat’.

    Intenta revisar el ejemplo en :
    http://msmvps.com/blogs/peplluis/archive/2008/09/16/problemas-en-la-recepci-243-n-de-datos.aspx

    Tambien encontraras diversos modelos y propuestas para efectuar recepcion de datos en :
    http://msmvps.com/blogs/peplluis/archive/tags/Puertos+Serie/default.aspx

    A partir de ese punto, si te parece vamos comentado tus dudas.
    Espero que esto te ayude.
    Pep Lluis,

  33. Al ver esto, me pregutno como seria para enviar datos a una impresora de tickets que este conectada al puerto USB?????? Lo he probado asi y no conecta (logico). Alguien sabe como.

  34. hola amigo lo que pasa que estoy haciendo un proyecto, sera que codigo que esta en la parte superior me sirve para recibir la entrada de datos
    de un plc atraves del puerto.. y al plc va conectado un sensor me invia informacion del objeto…
    espero que alguien me ayude lo mas pronto
    colombia.. sena… barranquilla
    mi correo es daimersanchez@hotmail.com
    gracias culaquier cosa me escribe al correo

  35. nesecito saber como leer los datos de una balanza electronica del modelo indicador – CI3000a por favorv quien me puede ayudar es urgente grcias

  36. hola pepeluismira lo que pasa es que quiero mandar datos tipo char pero se me ha complicado el procedimiento ojala me puedas ayudar hacer un ejemplo de mandar datos tipo char por el puerto serial.

  37. Hola Mariano,
    Debes utilizar la expresion ‘.Write(Chr(n))’ donde n representa el numero de caracter ASCII que como ya sabes corresponde a la representacin del mismo (0 a 255)
    Saludos,

  38. Tengo un periferico con el que me comunico atravez del com1, este me manda
    comandos mayores a 8 bytes, pero los recibo en bloques de 8 bytes… (me instale el
    portmon), ahora me hice un ejemplillo en vb6 con el control mscomm y aqui si
    recibo los mensajes en un solo bloque, esta en la configuracion en vb6 que
    uso para abrir el puerto:

    With MSComm1
    If .PortOpen Then .PortOpen = False
    ‘set the active serial port
    .CommPort = 1
    ‘set the badurate,parity,databits,stopbits for the connection
    .Settings = «19200,N,8,1»
    ‘set the DRT and RTS flags
    .DTREnable = True
    .RTSEnable = True
    ‘enable the oncomm event for every reveived character
    .RThreshold = 1
    ‘disable the oncomm event for send characters
    .SThreshold = 0
    ‘open the serial port
    .PortOpen = True
    End With ‘MSComm1

    para la clase SerialPort (vb.net 2005) utilizo la misma configuracion pero
    tiene este comportamiento de que siempre recibico los comandos en bloques de
    8 bytes a la vez cuando estoy recibiendo los datos.

    Sabes que podria ser ?

  39. si alguien puede ayudarme le agradezco necesito hacer el siguiente programa en visual 2005

    1. imprimir el almacen con> numero de ventas * año
    2. imprimir total ventas de almacen con < ventas 3.imprimir ventas * año.

  40. Hola Jopeve,
    Te aconsejaria postearas tu pregunta en los foros de reportes de MSDN, este post esta dedicado a repasar los principales mandatos del puerto serie.

    Saludos,
    Pep Lluis,

  41. hola pepe luis mi pregunta es la siguiente
    tengo un equipo con un sistema de bascula conectado por un puerto com el problema es que cada que se reinicia el equipo y inicio el programa de bascula me marca que el puerto esta ocupado a que se debera esto te lo agradezco por tus atenciones

    gracias

  42. hola pepe muy buen porte ^^, imaginate q necesito comunicar un PLC unitronics a mi pc y leer los datos entregados por el plc y visualizarlos en excel pero en tiempo real o lo mas cercano posible. espero me puedas colaborar mcuhas gracias ^^

  43. Hola Miguel,
    Lo ideal es tomar una plantilla de un Add-ins para excel y encapsular la funcionalidad de acceso a dicho PLC.

    Para tal proposito deberas incrustar el protocolo de comunicaciones del ‘Unitronics’, el cual desconozco 🙁

    Si crees interesante continuar la conversacion, puedes contactar conmigo utilizando la opcion [Contact]… estare encantado de colaborar dentro de mis posibilidades.

    Saludos,
    Pep Lluis,

  44. Como puedo activar una electro Chapa desde mi puerto serie ojala me puedan ayudar muchas gracias

    Necesito desarrollar una aplicacion que cuando un usuario pase un codigo de barras en un lector de Codigo de Barras este se verifique en una base de datos y si el usuario existe entonces se active una electrochapa que le permita el acceso.

    Lo unico qu me falta es como activar la chapa desde puerto serial

    Ojala me puedan ayudar

    Que DIOS bendiga todos y cada de ustedes en cada uno de sus dias y que este 2010 sea maravilloso para ustedes y sus seres queridos DIOS LES BENDIGA

  45. Pep Lluis:
    Muy buena tu nota por cierto.
    Estoy teniendo un problema con el uso de is.open. El mismo devuelve un boolean con valor False en el caso en que el puerto se encuentre cerrado y True en el caso en que esté abierto. Mi problema es el siguiente, yo quiero detectar de antemano en la aplicación si el puerto se encuentra abierto, para así indicarle al usuario que el mismo ya se encuentra abierto por otra aplicación, pero isopen, siempre que el puerto no lo haya abierto la aplicación en donde se ejecuta el comando, devuelve False.
    ¿Tenés idea de alguna solución?.

    Muchas gracias, Juan Bacigalupo.

  46. Hola Miguel Lopez,

    Es posible utilizando alguna de las señales de salida, pero en tal caso deben adaptarse los niveles logicos de voltage… +/-9V VCC a la tension de trabajo la electro-chpa. La otra posibilidad es utilizar un dispositivo comercial de E/S. Si te parece contactame a traves de la opcion [Contact] y continuamos la conversacion.
    Pep Lluis,

  47. hola a todos,

    quisiera hacer una aplicacion muy simple pero no se como hacerla:

    quiero hacer un programa en vb2005 que este abierto mientras no reciba nada por el puerto serie, y en el momento que reciba una señal de 5 voltios, ejecute otro programa y se cierre.

    podrian facilitarme el codigo si no es mucha molestia??

    un saludo y gracias

  48. hola a todos,

    quisiera hacer una aplicacion muy simple pero no se como hacerla:

    quiero hacer un programa en vb2005 que este abierto mientras no reciba nada por el puerto serie, y en el momento que reciba una señal de 5 voltios, ejecute otro programa y se cierre.

    podrian facilitarme el codigo si no es mucha molestia??

    un saludo y gracias

  49. Hola PepLLuis!

    Muy bueno tu blog pero tengo un problema al abrir los eejmplos que pones. Mi problema es como el de muchos de los que he leido por aqui, y es que el pc que tengo no tiene COM, con lo que tengo un conversor, pero el conversor solo pone los COM del 4 al 8.
    El codigo que utilizo es que te viene por defecto en visual basic C++ 2008 y tiene el inconveniente que no se donde o como declara que tiene que abrir el puerto COM1 con lo que no detecta nada y dice que esta cerrado.

    Como puedo cambiar la declaracion de los puertos, es decir, como hago para que me habra el COM5 por ejemplo?

    Gracias de antemano!
    Un saludo!

  50. Hola Carlos,
    Es simple… si estas utilizando el System.IO.Ports.SerialPort, solo tienes que asignar la propiedad ‘Name’… ejemplo :

    MiPuertoSerie.PortName = «COM4»

    antes de la operacion ‘Open’.

    o bien :

    MiPuertoSerie = My.Computer.Ports.OpenSerialPort(«COM4»)

    Tambien tienes la opcion de asignar al conversor el numero que desees, desde el administrador de dispositivos, puertos com/lpt, opciones avanzadas y seleccionar el COMx que quieras.

    Espero que esto responda a tu pregunta, en caso contrario no dudes en contactar de nuevo.

    Saludos,
    Pep Lluis,

  51. etoy haciendo un proyecto de un termometro   con ne555 con las sig. especificaciones…

    Adquisición de datos analógicos con el temporizador NE555

    Para leer señales analógicas, es necesario hacer la respectiva conversión a señal digital.  El temporizador NE555 genera pulsos variables (tiene como respuesta una frecuencia) a partir de dos resistencias y un capacitor.  Este enfoque de adquisición de datos implica los siguientes pasos:

    Descripción del temporizador NE555

    Fig. Temporizador NE555

    Fig. Circuito genérico

    Modo de operación

    El temporizador NE555 genera un pulso de acuerdo a los valores de dos resistencias y un capacitor.

    La siguiente fórmula se utiliza para calcular el periodo de este pulso.

    Donde:  

    Ra : Valor de la resistencia conectada a los pines  7 y 8

    Rb : Valor de la resistencia conectada a los pines  2 y 7

    Cap : Valor del capacitor polarizado conectado a tierra y a los pines 2 y 6

    Como ejemplo, se evalúa la formula con los siguientes valores:

        Ra        :           540 ohmio

        Rb        :           620 ohmio

        Cap      :           1 microfaradio =   Faradios

    Resultando

    T= 0.00123354 segundos

    Lo que genera un pulso con una frecuencia de

    La frecuencia calculada puede diferir de la frecuencia que se lee del temporizador NE555 por los efectos de la temperatura tanto en las resistencias como en el capacitor de este circuito.

    En un caso de aplicación práctica, se deberá mantener fija la resistencia Ra y el Capacitor, de modo que la variable que se estudia sea la resistencia Rb.  A medida que esta resistencia varíe, el temporizador generará diferentes frecuencias.  La frecuencia generada está en función de las variaciones de la resistencia en estudio.

    Programación

    El siguiente algoritmo permite leer y calcular la frecuencia generada por el temporizador NE555.

    /* Inicio */

    ctd_pulso_alto =0

    ctd_pulso_bajo =0

    leer_tiempo_del_sistema

    /* Bucle principal */

    mientras el tiempo transcurrido no haya superado 1 segundo  hacer

    inicio

    si bit_leido está en alto entonces

    inicio

                           ctd_pulso_alto = ctd_pulso_alto+1

    mientras bit_leido está en alto hacer

    inicio

    fin

    fin

    si bit_leido está en bajo entonces

    inicio

    ctd_pulso_bajo = ctd_pulso_bajo+1

    mientras bit_leido está en bajo hacer

    inicio

    fin

    fin

    fin {del mientras}

    /* Cálculos */

    frecuencia:=( ctd_ pulso_alto+ ctd_pulso_bajo)/2

    /* Fin */

    fin

    Ejemplo para un bulbo de temperatura (termómetro digital)

    En este ejemplo se definen las variables del circuito genérico para realizar la lectura de temperatura con el uso de una termoresistencia.

    La termoresistencia que se utiliza fue obtenida del bulbo de temperatura del sistema de control de refrigeración de un automóvil.

    A continuación se describe el circuito con los parámetros específicos de esta práctica.

    Circuito práctico

    Fig. Circuito practico

    La termoresistencia (bulbo) varia su resistencia de acuerdo a la temperatura.  Al variar esta resistencia, el circuito genera una frecuencia también variable.  

    En este caso específico, resulta más sencillo realizar una serie de mediciones con la ayuda de un termómetro, de modo que se registre la frecuencia respectiva para cada medición.  

    Los siguientes datos se obtuvieron con un circuito como el descrito anteriormente, y con la ayuda de un termómetro de mercurio

    Datos experimentales:

    Temperatura

    (grados centígrados) Frecuencia

    (hertz)

    120.0 1500

    89.0 870

    82.0 820

    70.0 725

    60.0 640

    40.0 460

    35.8 420

    33.8 405

    30.0 366

    27.0 339

    24.7 318

    22.5 297

    20.2 280

    10.0 204

    0.0 135

    necesito leer el pulso en algun puerto  me pueden alludar

  52. Hola Pep Lluis, excelente tu blog.
    Mira necesito hacer un programa en vb.net (tengo visual estudio 2008) donde el programa este siempre escuchando el puerto serial (COM1) y cuando llegue informacion por ese puerto la capture y la almacene.
    Ojala me puedas ayudar

    Gracias de antemano

  53. Nota para Ernaes,
    Sobre tu pregunta del NE555… es mejor que contactes directamente, opcion [Contact] y vemos como puedo ayudarte.

    Saludos,
    Pep Lluis,

  54. Hola tengo problemas para actualizar el texbox, tengo un pic conectado al pto usb, lo leo como pto COM, y le mando al Pc, datos de un teclado, pero no consigo que el texbox se actualice y me muestre las teclas presionadas, solo se queda con la primera espero me puedas ayudar. Soy de chile, aqui te dejo el codigo.

    Public Class Form1

    Dim Recibidos As String

    Public Sub New()

    ‘ Llamada necesaria para el Diseñador de Windows Forms.
    ‘ Agregue cualquier inicialización después de la llamada a InitializeComponent().
    InitializeComponent()
    If Not SerialPort1.IsOpen Then
    Try
    SerialPort1.Open() ‘ Para abrir el puerto.En este caso el com6 puerto virtual
    ‘ que genera el Proteus en mi aplicacion.

    Catch ex As Exception
    MessageBox.Show(ex.ToString)

    End Try
    End If
    ‘ Agregue cualquier inicialización después de la llamada a InitializeComponent().
    AddHandler SerialPort1.DataReceived, AddressOf Recepcion ‘delegado para que se pueda escribir en el texbox1
    End Sub
    ‘ Delegado
    Private Sub Recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

    Recibidos += SerialPort1.ReadExisting() ‘lee lo que tiene el bufer de entrada y lo guarda en la variable recibidos
    ‘Recibidos = SerialPort1.ReadLine()

    Me.Invoke(New EventHandler(AddressOf Actualizar)) ‘Necesario para poder ocupar el Texbox1

    End Sub

    Private Sub Actualizar(ByVal s As Object, ByVal e As EventArgs)

    TextBox1.Text += Recibidos

    End Sub

    End Class

  55. Hola Jerson,
    El codigo parece correcto para la funcion que detallas, debes tener en cuenta que para recibir datos debes adecuarte a los ajustes del dispositivo, por lo que deberias verificar la velocidad,paridad…etc.

    Tambien existen ciertas problematicas con adaptadores USB/Rs232, tengo algun post que los describe.

    Espero tus noticias,
    Pep Lluis,

  56. hola pepluis.
    tengo un problema con impresora okipos 425d cutter he descargado el driver version xp
    y se instala corrctamente pero al mandar a imprimir no sale nada mi puerto es serial
    solo logro hacerla imprimir cuando mando una pagina de prueba y sale lo siguiente ????xx???’ y termina pero no imprime nada desde black de notas ni otro programa espero
    me puedas ayudar.
    alguna sugerencia

    saludos gracias.

  57. Hola

    Necesito ayuda, No logro leer la pizarra telefonica conectada a mi RS232. Aqui esta el codigo

    Saludos

    Jose Acosta

    Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(«COM1»)
    With com1
    .BaudRate = 9600
    .Parity = IO.Ports.Parity.None
    .DataBits = 8
    .StopBits = IO.Ports.StopBits.One
    End With
    Dim Datos As String = «»

    MsgBox(com1.BytesToRead) ‘Aqui me da 0

    Datos = com1.ReadExisting
    MsgBox(Datos) ‘Aqui me da un mensage en Blanco
    End Using

  58. hola estoy programando en vb 2008, tengo un combox1 y quiero que se refleje en ese combo los puertos, com. que tiene la pc para poder seleccionerlos me podrias ayudar gracias

  59. Hola,
    necesito leer los datos de una balanza, ya tengo los datos de pariedad y bits de datos etc, pero lo necesito plasmar en una aplicacion pero nose por donde comenzar, se que deben usar el control serialPort, porfavor me podrias ayudar con algun ejemplo.
    Gracias

  60. Hola,

    Estoy teniendo problemas al tratar de enviar datos por el puerto serial, me sale que no puedo accesar al COM8 porque no tengo los privilegios necesarios. Que podria hacer para solventar este inconveniente?

    Muchisimas gracias,

    Grace!

  61. Intenta configurar tu puerto asignandole otro numero de port… ejm COM2, asegurate en caso de que hablemos de un adaptador USB/Serie que el driver funciona bien con otras aplicaciones, o si tienes algun software que al iniciarse el sistema, esta ocupando el puerto para conectarse con «un telefono» por ejemplo.
    En caso negativo, toma un ejemplo de mi blog «el de la bascula» por decir uno, he intenta hacerlo rodar con el numero de puerto asignado anteriormente.
    Ya nos contaras 😉
    Pep Lluis,

  62. Hola men
    sabes te he leido y seguido tus indicaciones arriba pero no pasa nada con la tarjeta la cual estoy enviando datos la idea es enviar un array tengo un codigo para visual 6 pero yo ocupo visual basic 2005 hice algo parecido para poder enviar y prender la tarjeta pero no pasa nada te envio el codigo de visual 6 que funciona y el de visual basic 2005 que no :/
    visual 6
    ////////////////////////////////////////////
    Private Sub Command1_Click()
    Dim arr() As Byte
    Dim a, b, c, d As Integer
    ReDim arr(18)

    arr(0) = 115 ‘s
    arr(1) = 100 ‘Centro

    arr(2) = 120 ‘m
    arr(3) = 1 ‘camara
    arr(4) = 111 ‘accion
    arr(5) = 101 ‘solicita respuesta

    With MSComm1
    .Output = arr
    Text1.Text = «»
    End With
    End Sub

    Private Sub Form_Load()
    With MSComm1
    .CommPort = 4
    .Settings = «9600,N,8,1»
    .PortOpen = True
    .InputLen = 0
    .RThreshold = 1
    End With
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    With MSComm1
    .PortOpen = False
    End With
    End
    End Sub

    Private Sub MSComm1_OnComm()

    With MSComm1
    sinput = .Input
    Text1.Text = Text1.Text + sinput
    Label1.Caption = Len(Text1.Text)
    End With
    End Sub
    ////////////////////////////////////////////

    visual basic 2005 (que no me funciona)
    /////////////////////////////////////////////

    Imports System.IO.Ports
    Imports System.IO.Ports.SerialPort

    Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Public a As Integer
    Public b As Integer
    Public c As Integer
    Public d As Integer

    Private Sub Command1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Command1.Click
    Dim arr() As Byte
    Dim Contador As Integer
    ReDim arr(18)
    arr(0) = 115 ‘s
    arr(1) = 100 ‘Centro
    arr(2) = 120 ‘m
    arr(3) = 1 ‘camara
    arr(4) = 111 ‘accion 82
    arr(5) = 101 ‘solicita respuesta

    Dim Serie As SerialPort

    If cmbpuerto.Text <> «» Then
    Serie = My.Computer.Ports.OpenSerialPort(cmbpuerto.Text)

    Serie.BaudRate = 9600
    Serie.DataBits = 8
    Serie.Parity = IO.Ports.Parity.None
    Serie.StopBits = IO.Ports.StopBits.One

    Dim Puerto As String
    Puerto = Serie.PortName
    Label5.Text = Puerto
    Dim Estado As Boolean
    Estado = Serie.CDHolding
    txtest.Text = Estado

    Dim SiNo As Integer
    SiNo = Serie.IsOpen
    Estado = Serie.CtsHolding
    Label2.Text = Estado

    Estado = Serie.DsrHolding
    Label4.Text = Estado
    Serie.RtsEnable = True
    Serie.DtrEnable = True

    Serie.ReadTimeout = 10
    Serie.WriteTimeout = 10
    Contador = Serie.BytesToWrite
    Dim numer As Integer
    For numer = 0 To 5
    Serie.Write(arr(numer))
    Next
    textrecibido.Text = Serie.ReadExisting()
    Else
    MsgBox(«Ingrese Puerto»)
    End If
    End Sub
    end Class
    ///////////////////////////////////////

    NEcesito ayuda :S

  63. Hola soy de Chile y te comento que es lo mejor que he encontrado para el manejo del puerto serial con VB 2005. He leido la gran parte de los POst y Solo darte las gracias por lo nuevo que he aprendido. Aunque sigo sin actualizar los datos recibidos..es el mismo caso de Jerson de Chile, he colocado bien la velocidad, paridad, etc. y utilizo una maquina (notebook) con puerto serial. Podrias apoyarme con mi interrogante

  64. Hola soy de Chile y te comento que es lo mejor que he encontrado para el manejo del puerto serial con VB 2005. Te comento que tengo el mismo problema de Jerson (Thursday, March 18, 2010 11:52 AM by jerson
    ), sigo sin actualizar los datos recibidos por la com1.. he colocado bien la velocidad, paridad, etc.porque lo puedo ver con Hyperterminal y en mi caso utilizo una maquina (notebook) con puerto serial. Podrias apoyarme con mi interrogante

  65. Hola Fede,
    Disculpa la tardanza en responder pero ya se sabe… el trabajo prioriza las necesidades.

    Para tratar de este tema estare encantado de ayudarte a traves de la opcion [Contact], asi podremos disponer de una comunicacion fluida.

    Espero tu correo,
    Gracias,
    Pep Lluis,

  66. Nota a Pablo y a todos los que necesitan contactar conmigo.

    He recibido muchas peticiones de ayuda a traves de este post. Me gustaria comentaros que por las caracteristicas del Blog se hace imposible gestionar pregunta/respuesta. Para ello os animo que contacteis directamente conmigo a traves de la opcion [Contact] o bien posteeis vuestras preguntas en los foros de MSDN, siempre intento estar al corriente y participar en las conversaciones en las que puedo aportar alguna respuesta.

    Gracias por vuestro interes y participación.
    Pep Lluis,

  67. uff, parece que por fin encuentro un sitio sobre este tema.
    Veras, me estoy iniciando en los scadas, a ver si pudieras orientarme con un ejemplo de tramas cómo enviarle al plc que ponga a I un contacto y cómo leer si una señal esta a O ó I.
    Muchas gracias.

  68. Hola, me estoy iniciando en los scada, mi cuestion es muy simple, a ver si me podeis poner un ejemplo en el que un boton me active una marca en el plc y leer una marca para hacer algo en el pc (por ejemplo el color del boton)

  69. Hola, tengo una impresora serial Epson, la que manejaba bajo VB 6.0, mediante el mscomm, me detectaba los errores producidos en la impresora (falta de papel, por ejemplo), sin embargo por necesidad tengo que migrar a VB.net 2005, puedo imprimir sin problemas, pero no se como dejar a la escucha los errores que llegan de la puerta.

    Agradeciendo tu gestion

    Saludos

  70. Hola,
    Estoy realizando un trabajo y una pequeña parte (muy importante) es leer información que llega a través de un pueto serie, he leido algunos post, pero mi problema es que no se VB
    Estoy intentando leer de un puerto serie información que envia un GPS (el puerto esta abierto y el GPS esta enviando la información), y mediante un macro de excel intento cargarlo a en una celda de excel.
    Me podrías hechar una mano.
    Gracias

  71. Buen dia

    No se si ya respondería esta consulta compre un validador de billetes, que se conecta por un cable de impresora USB, pero en los dispostitivos lo lee como un puerto .com, me dicen que funciona con los protocolos ID003 y ICT104U, he estado ejecutando los comando, que encontrado en los manuales pero no he logrado que funcione, con la aplicación que me entregaron funciona bien el billetero, queda en luz verde y azul y acepta el billete, pero con los codigos que le ejecuto recibe ordenes pero no queda en lectura.

    1. Hola que tal estoy igual, he tratado de comunicarme con el billetero pero no consigo hacerlo con el protocolo id003, con el software de ejemplo que he descargado de JCM se comunica bien, pero al intentar enviar comandos por el puerto yo mismo pues no hay ningún tipo de comunicación, de todas maneras si llego a lograr algo lo voy a comentar. Saludos desde Venezuela

      1. Concrétame la situación, y vemos como ayudarte.
        Dispones de los manuales/especificaciones del dispositivo?… tienes las características de las comunicaciones, Velocidad, Bits… uso de señales «handshaking»… etc?

        Continuamos.
        Saludos,

  72. hola..
    estoy tratando de hacer una software visual, para la apertura y cierre de una puerta a través de una chapa siendo esta controlada por medio de plc es para una chapa Southern Folger son chapas de seguridad.

    alguien que me pueda ayudar….

    saludos

    1. La respuesta dependerá del PLC, debes conocer el protocolo de comunicación con el mismo y conocer su programación para poder adaptarlo al software que quieres desarrollar.

      Intenta recopilar esa información.
      Saludos,

  73. Hola, buenas tardes.
    Estoy comenzando a trabajar con un PLC 1769-L30 ERM Compact Logix 5330ERM controller, no tengo conocimiento alguno mas es un requerimiento urgente y tengo poco tiempo para documentarme al respecto. Requiero escribir valores en un TAG de tipo REAL[5] mediante una aplicación .net (vs 2008)!!! Podría compartirme un código de ejemplo?? … se lo agradeceré demasiado.

  74. Buenos días PepLluis:

    Nuevamente te molestamos para brindarnos tu opinión respecto al proyecto del cronómetro controlado a través del Serial Port. Estamos todavía sin poder resolver la adquisición del estado de los sensores desde las entradas del serial port, por ejemplo CtsHolding y de esta manera disparar el cronómetro.
    Un abrazo y siempre agradecidos por tu valiosa información!

  75. Hola estoy intentando leer bytes del puerto serial en Visual Basic, tengo una trama compuesta de 18 bytes pero al leer byte por byte solo trae los primeros 6 y el resto no los devuelte tengo q volver a mandar la trama para que responda, alguien sabe por que me sucede esto

    1. Hola David,
      Sin saber nada de código y versión de entorno, seguro que el evento DataReceived se dispara antes de finalizar la lectura de los 18 bytes del buffer de recepción. En tal caso, no como buena practica puedes provar insertando un delay antes de leer el buffer. Con 50Ms seguramente es suficiente «Threat.sleep(50)»

  76. Hello Luis,

    In the control XON/XOFF exist a problem in standart to readline and print line.
    Thanks for you publicationts and colaborations.
    The comunicationts and interruptionts in signal serial exist a problem to paralel comunicationts, the error permit flush informationts in memory and buffer comunicationts
    The error not respet standart comunicationts signal

Responder a Alfonso Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *