|
Página 1 de 1
|
Enviar Datos Usando SerialPort
Autor |
Mensaje |
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Enviar Datos Usando SerialPort
Comento lo siguiente:
En el trabajo usamos controles de acceso que corren bajo Windows y no es mucho negocio. Entonces pensé en crear una aplicación sencilla para administrarlos. Se conectan mediante puerto serie, pero tenemos un adaptador a USB.
He intentado enviar comandos de acuerdo a ésta documentación.
Lo que no comprendo es qué y cómo enviar correctamente. Dice:
Data Format: Binary Hex Data
Después dice: Head, length, etc. todos 8 bits
La verdad que si pudiera superar ésta brecha podría desarrollar algo sencillo para cargar usuarios y ése tipo de cosas. Sería algo más que útil para mi trabajo. Desde ya, agradezco la ayuda.
|
#1 Martes, 20 Diciembre 2011, 18:15 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
Re: Enviar Datos Usando SerialPort
Pues con el ejemplo del documento lo puedes comprender.
Para enviar una instrucción es una trama de datos con la siguiente estructura:
Head (encabezado) - 1 byte de longitud
Creo siempre es 0x7E
Length (longitud) - 1 byte de longitud
Es la cantidad de bytes desde el campo 'Destination ID' (es el siguiente) hasta el final de la trama. Incluyendo los campos XOR y SUM.
Destination ID (ID de destino) - 1 byte de longitud
El ID lo obtienes desde el dispositivo, ve el manual para saber cómo.
Command (comando, orden) - 1 byte de longitud
Es la instrucción en si misma, en el documento vienen los diferentes comandos.
Data (datos) - longitud variable desde 0x00 hasta 0xD0
Los datos a ocupar para el comando dado. Data puede no existir.
XOR (OR exclusiva) - 1 byte de longitud
Realiza la operación lógica XOR (OR exclusiva) de cada byte desde 'Destination ID' hasta el bloque 'Data' con el valor 0xFF.
SUM (suma) - 1 byte de longitud
Suma todos los bytes desde 'Destination ID' hasta 'XOR'. Si la suma es mayor a 0xFF quedarse con el byte más bajo.
El ejemplo del documento es la siguiente trama:
0x7E 0x04 0x01 0x18 0xE6 0xFF
head length ID CMD XOR SUM
length es 0x04 porque son 4 bytes que le siguen.
El ID para este ejemplo es 0x01, pero ese depende del de tu dispositivo.
El comando para este ejemplo es 0x18.
Data en este ejemplo no existe.
XOR es 0xE6 dado que 0xFF XOR 0x01 XOR 0x18 = 0xE6.
SUM = 0x01 + 0x18 + 0xE6.
Nota01: Espero estés familiarizado con operaciones binarias y con el sistema hexadecimal.
Nota02: La información que te he dado es la que saqué del documento que pasaste.
Saludos!
|
#2 Jueves, 22 Diciembre 2011, 05:59 |
|
|
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Re: Enviar Datos Usando SerialPort
Como verás, entiendo muy poco sobre lo que estoy tratando de dilucidar. He leído tus explicaciones y lo único que se me ha ocurrido es lo siguiente:
DIM A AS Byte
DIM B AS Byte
DIM C AS Byte
DIM D AS Byte
DIM E AS Byte
DIM F AS Byte
A = &7E&
B = &04&
C = &01&
D = &18&
E = &E6&
F = &FF&
WRITE #Sport, A, Lof(Sport)
WRITE #Sport, B, Lof(Sport)
WRITE #Sport, C, Lof(Sport)
WRITE #Sport, D, Lof(Sport)
WRITE #Sport, E, Lof(Sport)
WRITE #Sport, F, Lof(Sport)
El adaptador tiene dos luces, una verde "-RX" y una roja "-TX". Cuando envío datos con el código de arriba la luz roja se enciende... la verde nada. Gracias por tu ayuda raza.
|
#3 Jueves, 22 Diciembre 2011, 19:13 |
|
|
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Re: Enviar Datos Usando SerialPort
Pues con el ejemplo del documento lo puedes comprender.
Para enviar una instrucción es una trama de datos con la siguiente estructura:
Head (encabezado) - 1 byte de longitud
Creo siempre es 0x7E
Length (longitud) - 1 byte de longitud
Es la cantidad de bytes desde el campo 'Destination ID' (es el siguiente) hasta el final de la trama. Incluyendo los campos XOR y SUM.
Destination ID (ID de destino) - 1 byte de longitud
El ID lo obtienes desde el dispositivo, ve el manual para saber cómo.
Command (comando, orden) - 1 byte de longitud
Es la instrucción en si misma, en el documento vienen los diferentes comandos.
Data (datos) - longitud variable desde 0x00 hasta 0xD0
Los datos a ocupar para el comando dado. Data puede no existir.
XOR (OR exclusiva) - 1 byte de longitud
Realiza la operación lógica XOR (OR exclusiva) de cada byte desde 'Destination ID' hasta el bloque 'Data' con el valor 0xFF.
SUM (suma) - 1 byte de longitud
Suma todos los bytes desde 'Destination ID' hasta 'XOR'. Si la suma es mayor a 0xFF quedarse con el byte más bajo.
El ejemplo del documento es la siguiente trama:
0x7E 0x04 0x01 0x18 0xE6 0xFF
head length ID CMD XOR SUM
length es 0x04 porque son 4 bytes que le siguen.
El ID para este ejemplo es 0x01, pero ese depende del de tu dispositivo.
El comando para este ejemplo es 0x18.
Data en este ejemplo no existe.
XOR es 0xE6 dado que 0xFF XOR 0x01 XOR 0x18 = 0xE6.
SUM = 0x01 + 0x18 + 0xE6.
Nota01: Espero estés familiarizado con operaciones binarias y con el sistema hexadecimal.
Nota02: La información que te he dado es la que saqué del documento que pasaste.
Saludos!
Raza:
Logré enviar datos a través de gambas y obtener respuesta, pero tengo un gran problema:
La manera en que puedo enviar los datos es haciendo un PRINT el el puerto serial con la siguiente STRING:
"\x7E\x04\x01\x18\xE6\xFF"
Sucede que manipular eso me ha traído dolores de cabeza que persisten todavía porque si a mi se me ocurre enviar algo que sea distinto de "\x7E\x04\x01\x18\xE6\xFF", por ejemplo: "\x7E" & "\x04" etc. obtengo el mensaje de error "Bad character string" y no puedo iniciar el programa. Es fundamental que pueda construir esa string a partir de cálculos, por ejemplo, si quisiera que otra función le diga que tiene que manipular otro nodo diferente, por ejemplo el nodo 10 (en hexa 16) debería modificar "\x01" por "\x16" y no encuentro manera de manipular las strings con "\x". He visto que la manera de representar un numero hexadecimal como string es poniendo delante "\x". Estoy atasacado, no sé como manejar éste problema. Imagino que hay alguna manera formal de enviar datos al stream como hexadecimales, pero no la encuentro. Si yo envio directamente &7E, etc. el equipo no responde.
Gracias por tu ayuda.
|
#4 Lunes, 23 Enero 2012, 04:35 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
Re: Enviar Datos Usando SerialPort
Para los datos hexadecimales es con &H, ejemplo &HAA.
A mi me funciona algo como:
PRINT #SerialPortX, "\xAA" & "\xBB";
El punto y coma ";" al final es importante para que no te imprima un salto de línea.
Experimentando he logrado hacer esto, espero te sirva:
Saludos!
|
#5 Lunes, 23 Enero 2012, 22:20 |
|
|
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Re: Enviar Datos Usando SerialPort
Amigo Raza:
Gracias por tu código. Te comunico que encontré la forma de mandar los datos. Es bastante diferente a la que me mostrás:
dónde &Sal.Write es String[]
Primero almaceno todo y luego ejecuto ése comando. Ahora estoy haciendo al capa de comandos y luego terminaré con el manejo de datos. Mil gracias por tu ayuda, será valiosa.
|
#6 Miercoles, 25 Enero 2012, 00:10 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|