Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: coco 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:
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 (http://sites.google.com/site/santiagohssl/clsCom.cls?attredirects=0&d=1)
saludos
-
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.
-
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!
-
que es eso de puertos serie?? o para q sirve esa clase plzz expliquen soy cero en eso
-
que es eso de puertos serie?? o para q sirve esa clase plzz expliquen soy cero en eso
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 (http://es.wikipedia.org/wiki/Puerto_serie).
saludos
-
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
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.
-
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
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
-
little improvement can not open COM31, COM32 ..
repair code:
strCom = "\\.\" & "COM" & CStr(c_lngComPort)