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?
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
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:
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
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?
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
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
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...
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...
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
Alba
10 de Noviembre del 2021
Todavía no lo he probado, pero tiene muy buena pinta.
Lo voy a probar en Access 2019, y ya te diré qué tal ha ido.
Comentarios sobre la versión: 0.1 (14)
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
Este es el codigo fuente:
DoCmd.SetWarnings False
DoCmd.RunSQL CadenaReg
DoCmd.SetWarnings True
Saludos.
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
Saludos
Saludos
' 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
Gracias.
Saludos
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
Lo voy a probar en Access 2019, y ya te diré qué tal ha ido.