Código de Access - Modulo para E/S puertos RS232

Imágen de perfil
Val: 187
Bronce
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

Modulo para E/S puertos RS232gráfica de visualizaciones


Access

estrellaestrellaestrellaestrellaestrella(12)
Publicado el 11 de Julio del 2019 por Francisco
804 visualizaciones desde el 11 de Julio del 2019
Estas librería se componen de un modulo y una clase para realizar E/S sobre puertos RS232

Requerimientos

Access 2000 o superior

0.1
estrellaestrellaestrellaestrellaestrella(12)

Publicado el 11 de Julio del 2019gráfica de visualizaciones de la versión: 0.1
805 visualizaciones desde el 11 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

  • Archivos para descargar

Si alguno de los archivos de descarga no funciona, comentanos aquí el error.




Comentarios sobre la versión: 0.1 (12)

Imágen de perfil
12 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
Estoy haciendo una aplicación de comunicacion por puerto serial com1 por RS-232, esta libreria puede servir para mi proyecto porque lo estoy haciendo en C++. Tu crees que se pueda usar para VBA bajo Excel?
Responder
Imágen de perfil
14 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
Buenas noches. Soy programador en VBA para Excel. Lo analicé y no hay una función para enviar dados por el puerto serial. Tienes alguna que me pueda servir?, Tienes algún manual o documentación? Gracias
Responder
Imágen de perfil
15 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
Buenas tardes, estoy usando las funciones de puerto Serial desde Access y me da un error de Sintaxsis cuando llamo la funcion de OpenPort() o InitPort() en el la instruccion:

RaiseEvent ErrorComm(GetLastError, "InitPort", "clsComm")

Estoy haciendo un programa que reciba datos por el puerto Serial RS232 y los guarde en una Base de datos y si lo hago en access seria perfecto... Gracias y Saludos
Responder
Imágen de perfil
8 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Buenos dias amigo. Escribí una pequeña rutina basada en tu codigo de comunicacion por puerto serial. Quisiera daber tu opinion porque no tengo muy claro la parte de ReadPort(). Esta función lee directamente del puerto la informacion y la guarda en el string? o hay que pasar por la información por ArrayByteToString() antes de guardar en la tabla de datos?

Este es el codigo fuente:

Sub Recibir()
Dim AbrirP, ConfigP, CerrarP As Boolean
Dim ContarP As Long
Dim Rafaga, Cadena, CadenaReg As String
Dim OK As Boolean
Dim Fun As New clsComm
Dim Mensaje, Mensaje1, Mensaje2, Estilo, Titulo1, Cuadro1, Cuadro2, Cuadro3, Cuadro4, Cuadro5
Dim Mensaje3, Mensaje4, Mensaje5

Estilo = vbOKOnly + vbDefaultButton2
Titulo1 = "Mensaje Importante"

ContarP = Fun.CountPort()
Mensaje1 = "Cantidad de Puertos: " & ContarP
Cuadro1 = MsgBox(Mensaje1, Estilo, Titulo1)

AbrirP = Fun.OpenPort(eCom1, 256, 256)
Mensaje2 = "Apertura exitosa de Puerto Com1: " & AbrirP
Cuadro2 = MsgBox(Mensaje2, Estilo, Titulo1)

ConfigP = Fun.InitPort(eBr9600, eByte7, eOdd, eOne5StopBit)
Mensaje3 = "Configuración de Puerto a 9600, 7, Odd, 1: " & ConfigP
Cuadro3 = MsgBox(Mensaje3, Estilo, Titulo1)

Rafaga = Fun.ReadPort(1)
Rafaga = "Prueba de Recepcion de Datos"
Mensaje4 = "Datos Recibidos por el Puerto: " & Rafaga
Cuadro4 = MsgBox(Mensaje4, Estilo, Titulo1)

CerrarP = Fun.ClosePort()
Mensaje5 = "Cierre Exitoso de Puerto: " & CerrarP
Cuadro5 = MsgBox(Mensaje5, Estilo, Titulo1)

DoCmd.SetWarnings False
CadenaReg = "insert into Recibido (Rafaga_Coulter) Values ( '" & Rafaga & "' )"
DoCmd.RunSQL CadenaReg
DoCmd.SetWarnings True
End Sub

Saludos.
Responder
Imágen de perfil
9 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Hola

CountPort() lo que da es la cantidad de bytes que hay en el buffer del puerto serial, o cuantos bytes han llegado al puerto

ArrayByteToString() es usado por ReadPort() para convertir un array en cadena, si miras en ReadPort() hay una variable array de tipo byte llamada lpBuffer ese array lo llena ReadFile() por lo tanto se debe convertir lpBuffer a String para devolverlo en la funcion

Saludos
Responder
Imágen de perfil
9 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
ok ya entendí el punto. Me preocupa es el argumento de ReadPort() si pudiera leer todo lo que llega por el puerto mejor pero voy a hacer una rutina con un bucle para leer todo... Gracias y Saludos
Responder
Imágen de perfil
12 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Par leer todo lo que esta en el puerto puede hacerlo de la siguiente manera

IF Fun.CountPort() > 0 THEN
sCad = Fun.ReadPort(Fun.CountPort())
END IF

Saludos
Responder
Alvin
9 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Si quieres me mandas tu correo y por ahi intercambiamos información. El mio es: alvinc71@gmail.com
Responder
Imágen de perfil
12 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
fpradove@gmail.com

Saludos
Responder
Imágen de perfil
13 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Intenté hacer una prueba con un archivo en VBA desde Excel y se me quedó colgado. Eliminé estas instrucciones del codigo:

' If ReadFile(hCom, lpBuffer(0), nBytesToRead, nBytesRead, ByVal 0&) = 0 Then
' RaiseEvent ErrorComm(GetLastError, "ReadPort", "clsComm")
' Exit Function
' End If

Cuando le puse comentario la macro funcionó pero el problema es que cuando envié datos desde la otra PC la función CountPort me reporto que encontró 1058 bytes en el puerto, pero la función
ReadPort = ArrayByteToString(lpBuffer()) no leyó nada...

Me falta hacer la prueba con access... voy a intentarlo esta semana... y voy a probar con la que acabas de enviar...

Saludos
Responder
Imágen de perfil
19 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Buenos días Francisco. Pude probar el programa de comunicación utilizando tu librería de funciones y con el protocolo de: 9600 Bps, Tamaño de Bytes: 8, Parity: Odd, StopBit: 1. y funcionó. El problema es que al parecer lo manda por lotes o no sé si el buffer es muy pequeño. En la función OpenPort le puse 256 de Buffer y el mensaje llega incompleto y le puse 1024 de buffer y termino colgado... Lo volví a colocar en 256 y fue la forma como funcionó pero el mensaje llega incompleto. También descargué de esta página un programa en Visual Basic que se llama Indicador que es genérico para probar comunicaciones y noté que el mensaje se corta 4 veces y lo que lee el mío desde el puerto es el último bloque... los tres anteriores no los ve. No sé qué pueda estar pasando. Si tienes alguna idea...

Gracias.
Saludos
Responder
Imágen de perfil
20 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Buen día


Lo primero que tienes que hacer establecer un protocolo al menos de lectura

1) Cuales son los caracteres de inicio (STX) o final (ETX) de la cadena

2) Debe saber si el mensaje se recibe como binario HEX o ASCII (Texto Claro)

2) Cual es la longitud del mensaje, si es fijo o dinámico


La lógica a seguir en estos casos es

a) Abrir puerto

b) Esperar por el carácter STX en un ciclo o por un tiempo X en segundos si no llega el carácter entonces se devuelve un error por TIMEOUT , se cierra el puerto y termina el procedimiento

c) Ya tenemos nuestro STX entonces leemos el resto de la cadena

c.1) Si es fijo se lee ReadPort(LEN_CANDENA) y se guarda en una variable , se cierra el puerto y se termina el procedimiento

c.2) Si la cadena es longitud variable entonces en un ciclo se arma la cadena usando var:= var & ReadPort(1) hasta que consiga el ETX, se cierra el puerto y termina el proceso

d) Normalmente o por lo general pero no siempre, se envía un CheckSum() al final de la cadena antes de ETX, sea fijo o dinamico en la medida que recibas debes calcular el checksum() para comprobar si es valido el mensaje

e) A veces, según el propósito de tu programa un mensaje puede contener varias cosas y es necesario tokenizar el mensaje usando cualquier técnica de parsing, esto se hace luego de haber recibido toda la cadena, imagínate pues un GPS que envía latitud, logitud y altura en metros, los tres valores en una cadena y estos valores separados por coma, se vería mas o menos así: STX30.9987847,12.0934583,1200ETX


Esperando haber aclarado tus dudas
Responder

Comentar la versión: 0.1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s5415
Revisar política de publicidad