Autor Tema: [src] clsCom: manejo del puerto serie  (Leído 7877 veces)

0 Usuarios y 1 Visitante están viendo este tema.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
[src] clsCom: manejo del puerto serie
« en: Junio 03, 2010, 07:31:04 pm »
Despues de ver un par de ejemplos del manejo del puerto serie en PSC, diseñe esta clase; porque los que habia ahi eran un desastre.
Los que quieren usar el puerto serie de la pc (COM1,COMx) obviamente saben que necesitan el control MSCOMM.ocx, pero aca hay una solucion: clsCom.

La clase tiene todo adentro, y es muy sencilla de usar.

Propiedades:
  • ComPort (Let/Set), Long (default = 1): numero del puerto serie. si la clase tiene abierto un puerto, y se cambia la propiedad, automaticamente se cierra, y se re-abre con la misma configuracion (pero distinto numero de puerto)
  • ComSettings (Let/Set), String (default = "9600,n,8,1"): configuracion del puerto. obedece el formato bps,parity,bits,stop_bits
  • TimerDelay (Let/Set), Long (default = 1000): retardo utilizado por el timer interno para leer si hay algun dato en el puerto (solo cuando esta abierto y .TimerEnabled = True) y disparar el evento DataReceived
  • TimerEnabled (Let/Set), Boolean (default = True): flag para indicar si se va a utilizar el polling de datos mediante el timer

Metodos:
  • InitCom (ret: Boolean): abre el puerto con la configuracion establecida previamente (devuelve si se abrio o no)
  • KillCom (ret: Boolean): cierra el puerto, si es que estaba abierto previamente
  • ReadCom (ret: String): lee 255 bytes (o menos) del buffer del puerto serie, y los devuelve como string
  • WriteCom (ret: Boolean, params: strWrite String): escribe strWrite en el puerto serie, cortandolo en fragmentos consecutivos de 255 bytes cada uno (obviamente que es posible que el ultimo fragmento no sea de 255 bytes, sino que menos)

Aca te dejo un ejemplo bien facil donde se muestran todas las funciones de la clase:
Código: (vb) [Seleccionar]
Private WithEvents f_objCom As clsCom

Private Sub Form_Load()
    Set f_objCom = New clsCom
    f_objCom.ComPort = 1 ' COM1
    f_objCom.ComSettings = "115200,N,8,1" ' 115200 bps, sin paridad, 8 bits de data, 1 bit de stop
    f_objCom.TimerDelay = 500 ' 500ms para chequear si entro data
    Call f_objCom.InitCom
   
    Call f_objCom.WriteCom("Serie!")
End Sub

Private Sub Form_Unload(Cancel As Integer)
   
    Set f_objCom = Nothing

End Sub

Private Sub f_objCom_DataReceived(ByVal strData As String)
    Debug.Print "DataRcv: "; strData
End Sub


FIXXX:
gracias a bebekbdbg, reemplazar en la funcion "InitCom"
strCom = "COM" & CStr(c_lngComPort) & ":"
por  strCom = "\\.\" & "COM" & CStr(c_lngComPort)
Y bueno, aca el link: clsCom.cls

saludos
« última modificación: Junio 05, 2013, 09:04:12 pm por coco »
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #1 en: Junio 04, 2010, 07:02:35 am »
Muy buena coco, intente utilizarla desde vba (excel)   con una lectora de tarjeta y otro artefacto uno esta en el com1 y el otro en el com2 , pero no obtuve ninguna data, seguramente es porque hice algo mal. vos en el ejemplo pusite esto "115200,N,8,1" hay que poner algun valor especifico para una lectora de targeta?.

Saludos.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #2 en: Junio 04, 2010, 06:24:13 pm »
Muy buena coco, intente utilizarla desde vba (excel)   con una lectora de tarjeta y otro artefacto uno esta en el com1 y el otro en el com2 , pero no obtuve ninguna data, seguramente es porque hice algo mal. vos en el ejemplo pusite esto "115200,N,8,1" hay que poner algun valor especifico para una lectora de targeta?.

Saludos.

y ahi esta a 115200 bps, creo que es mucha velocidad para una tarjeta, proba con 9600 que es algo mas *standard*, sino fijate en el manual del aparato a ver cual es la velocidad.

saludos!
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 210
  • Reputación: +2/-4
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #3 en: Junio 05, 2010, 02:59:52 am »
que es eso de puertos serie?? o para q sirve esa clase plzz expliquen soy cero en eso
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #4 en: Junio 05, 2010, 02:23:21 pm »
que es eso de puertos serie?? o para q sirve esa clase plzz expliquen soy cero en eso
Citar
Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales, frecuentemente utilizado por computadoras  y periféricos, en donde la información es transmitida bit a bit enviando un solo bit a la vez, en contraste con el puerto paralelo que envía varios bits simultáneamente. La comparación entre la transmisión en serie y en paralelo se puede explicar usando una analogía con las carreteras. Una carretera tradicional de un sólo carril por sentido sería como la transmisión en serie y una autovía  con varios carriles por sentido sería la transmisión en paralelo, siendo los vehículos los bits que circulan por el cable.
De Wikipedia.

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

NolO

  • Kilobyte
  • **
  • Mensajes: 73
  • Reputación: +6/-0
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #5 en: Junio 09, 2010, 11:44:36 am »
Hi! una pregunta esta clase tambien la podria usar para poder trabajar con los puertos Lpt1: Lptx:

Te comento un poco lo que me pasa, en mi bd guardo en una tabla los puertos por donde quiero que salgan las impresiones que pueden ser por los puertos com y/o los lpt, el hacer la lectura de esos campos y enviar la impresion es simple, el problema lo tengo cuando envio una impresion y la impresora esta apagada o no tiene papel o hay un problema de comunicacion(conexion), ya he visto y probado muchos ejemplos que encuentro en la web,  pero al final lo unico que pude hacer fue colocar un "On Local Error GoTo MiError" y mostrar por un block de notas de esta manera

Código: (vb) [Seleccionar]
On Local Error Goto mError
Dim rs          As ADODB.Recordset
Dim PuertoImp    As String
Dim CadCortaTicket As String
Dim CadAbreGaveta As String
'Esto para la impresora Epson TM-U220A Modelo M188A
CadAbreGaveta = Chr(27) + "p" + Chr(0) + Chr(25) + Chr(250)
CadCortaTicket = Chr(27) + "i"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "SELECT *FROM PARAMTICKET", Con, adOpenDynamic, adLockReadOnly
if Not rs.EOF Then
PuertoImp = IIf(IsNull(rs!PuertoTicket), "", rs!PuertoTicket)
Else
        PuertoImp = PortDefault
End If
If Trim(PuertoImp) = "" Then
        MsgBox "No hay Impresora Configurada. ", vbCritical + vbDefaultButton1, " Error de Impresión"
        Exit Sub
End If
DoEvents
nfic = FreeFile
Open PuertoImp For Output As nfic
Print #nfic,"Imprime primera linea"
Print #nfic,"Imprime segunda linea"
'......
'......
Print #nfic,"Imprime n lineas"
Print #nfic, CadAbreGaveta
Print #nfic, Chr(13) + CadCortaTicket
Close nfic
' Aqui es donde le indico que lo muestre por pantalla en un block de notas
mError:
Shell "C:\WINDOWS\notepad.exe " & App.Path & "\abc.txt", vbMaximizedFocus

Se que no es la forma adecuada de solucionar el problema, pero fue lo unico que se ocurrio o tal vez no lo estoy haciendo como deberia de hacerlo.
De antemano muchas gracias por su tiempo, y mil disculpas si no he sido muy claro.

Saludos.
« última modificación: Junio 09, 2010, 12:06:17 pm por NolO »

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #6 en: Junio 09, 2010, 02:27:53 pm »
Hi! una pregunta esta clase tambien la podria usar para poder trabajar con los puertos Lpt1: Lptx:

Te comento un poco lo que me pasa, en mi bd guardo en una tabla los puertos por donde quiero que salgan las impresiones que pueden ser por los puertos com y/o los lpt, el hacer la lectura de esos campos y enviar la impresion es simple, el problema lo tengo cuando envio una impresion y la impresora esta apagada o no tiene papel o hay un problema de comunicacion(conexion), ya he visto y probado muchos ejemplos que encuentro en la web,  pero al final lo unico que pude hacer fue colocar un "On Local Error GoTo MiError" y mostrar por un block de notas de esta manera

Código: (vb) [Seleccionar]
On Local Error Goto mError
Dim rs          As ADODB.Recordset
Dim PuertoImp    As String
Dim CadCortaTicket As String
Dim CadAbreGaveta As String
'Esto para la impresora Epson TM-U220A Modelo M188A
CadAbreGaveta = Chr(27) + "p" + Chr(0) + Chr(25) + Chr(250)
CadCortaTicket = Chr(27) + "i"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "SELECT *FROM PARAMTICKET", Con, adOpenDynamic, adLockReadOnly
if Not rs.EOF Then
PuertoImp = IIf(IsNull(rs!PuertoTicket), "", rs!PuertoTicket)
Else
        PuertoImp = PortDefault
End If
If Trim(PuertoImp) = "" Then
        MsgBox "No hay Impresora Configurada. ", vbCritical + vbDefaultButton1, " Error de Impresión"
        Exit Sub
End If
DoEvents
nfic = FreeFile
Open PuertoImp For Output As nfic
Print #nfic,"Imprime primera linea"
Print #nfic,"Imprime segunda linea"
'......
'......
Print #nfic,"Imprime n lineas"
Print #nfic, CadAbreGaveta
Print #nfic, Chr(13) + CadCortaTicket
Close nfic
' Aqui es donde le indico que lo muestre por pantalla en un block de notas
mError:
Shell "C:\WINDOWS\notepad.exe " & App.Path & "\abc.txt", vbMaximizedFocus

Se que no es la forma adecuada de solucionar el problema, pero fue lo unico que se ocurrio o tal vez no lo estoy haciendo como deberia de hacerlo.
De antemano muchas gracias por su tiempo, y mil disculpas si no he sido muy claro.

Saludos.

pero eso de abrir puertos con Open "COM1" for Output, es un problema porque eso solo era valido en BASIC de DOS, en VB ya no sirve eso. es mas, creo que funcionaba en algun momento, pero con windows 9x (95,98,ME), es decir que en NT ya no sirve.

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

bebekbdg

  • Bytes
  • *
  • Mensajes: 15
  • Reputación: +0/-0
    • Ver Perfil
Re:[src] clsCom: manejo del puerto serie
« Respuesta #7 en: Agosto 09, 2010, 12:28:26 pm »
little improvement can not open COM31, COM32 ..
repair code:
strCom = "\\.\" & "COM" & CStr(c_lngComPort)