A continuación encontrarás traducida al español la entrada escrita originalmente en inglés sobre comunicación con dispositivos serie en Xojo y que está disponible en el portal de desarrolladores de Xojo.
Un dispositivo serie es un dispositivo que se comunica enviando y/o recibiendo datos en serie. Esto significa que puede estar enviando o bien recibiendo datos en un momento dado. Es decir, no tiene la capacidad de enviar y recibir datos al mismo tiempo. El dispositivo serie más común es un módem. Algunas impresoras son también dispositivos serie. Las comunicaciones serie se llevan a cabo mediante la clase Serial. Para comunicar con un dispositivo serie es preciso configurar e instanciar un objeto a partir de la clase Serial, abrir el puerto serie para crear una conexión, leer y/o escribir datos hacia el dispositivo y/o desde el dispositivo conectado a uno de los puertos serie del equipo. Por último es preciso cerrar el puerto serie cuando se haya finalizado para desconectarse del puerto serie.
Configuración del puerto serie
El primer paso consiste en añadir la clase Serial al proyecto. El modo más fácil de hacerlo consiste en arrastrar un controlador Serial desde la Biblioteca hacia la Ventana. También puedes arrastrar el controlador Serial a la Barra de Navegación para crear una subclase que puedas instanciar en código.
Antes de que comiences a comunicarte con el dispositivo serie habrás de inidcar al controlador Serial el puerto a utilizar, así como la velocidad de comunicación y otros ajustes necesarios. Si has añadido el controlador Serial a tu ventana, entonces podrás cambiar estas propiedades usando el Inspector.
Los detalles sobre cómo configurar estas propiedades depende por entero del dispositivo que se esté utilizando. Deberías consultar la documentación del dispositivo para determinar los ajustes soportados.
Abrir el Puerto
Una vez has configurado el controlador Serie, puedes abrir el puerto serie para iniciar las comunicaciones con el dispositivo serie. Esto se lleva a cabo llamando al método Open de la clase. Este método devuelve el valor True si la conexión se ha abierto con éxito y False en caso contrario. Por ejemplo, supongamos que tenemos un controlador Serial cuyo nombre es SerialDevice
. Se puede abrir el puerto serie usando el siguiente código:
If SerialDevice.Open Then
MsgBox("Opened serial port.")
Else
MsgBox("Could not open serial port.")
End if
Una vez se haya abierto el puerto serie con éxito este dejará de estar disponible para el resto de otras aplicaciones hasta que se haya cerrado (así como para otros controladores Serial también). Para cerrar el puerto Serial, se invoca el método Close:
SerialDevice.Close
Lectura de Datos
Cuando el dispositivo serie devuelve datos al controlador Serial al que está conectado, dichos datos se encuentran en una ubicación de la memoria del ordenador denominada buffer. El buffer (o memoria intermedia) es simplemente un lugar en el que se almacenan los datos enviados por el dispositivo serie, dado que la mayoría de los dispositivos serie carecen de la cantidad de memoria suficiente como para albergarlos ellos mismos. Cuando los datos llegan al buffer, se dispara el manejador de evento DataAvailable del controlador Serial.
En el manejador de evento DataAvailable puedes utilizar los métodos Read o ReadAll para obtener todos o parte de los datos almacenados en el buffer. Dichos datos se devuelven como String. Utiliza el método Read cuando quieras obtener una cantidad concreta de bytes (caracteres) del buffer. Si quieres obtener todos lod datos del buffer, entonces tendrás que utilizar el método ReadAll. En ambos casos, los datos devuelvos por el buffer son eliminados de dicha memoria temporal de modo que se libere espacio para la recepeción de los nuevos datos entrantes. Si necesitas examinar los datos en el buffer sin eliminarlos del mismo, entonces tendrás que utilizar el método LookAhead.
Este ejemplo en el evento DataAvailable se encarga de añadir los datos entrantes a una TextArea:
TextArea1.AppendText(Me.ReadAll)
Puedes borrar todos los datos del buffer sin leerlos invocando el método Flush.
Tanto el méotod Read como ReadAll pueden tomar un parámetro opcional que te permite indicar la codificación. Utiliza el objeto Encodings para obtener la codificación deseada y pasarla como parámetro. Por ejemplo, se ha modificado el anterior fragmento de código para indicar que el texto entrante utilice la codificación ANSI, un estándar en Windows:
TextArea1.AppendText(Me.ReadAll(Encodings.WindowsANSI))
Es posible que también debas de indicar la codificación cuando se trate de texto entrante de otra plataforma o esté en otro lenguaje. Para obtener información adicional sobre codificación de texto, puedes consultar la sección Encodings del área de desarrolladores de Xojo.
Escribir Datos
Puedes enviar datos al dispositivo serie en cualquier momento siempre y cuando esté abierto el puerto serie. Se envían datos utilizando el método Write. Los datos a enviar deben de ser de tipo String. El método Write se realiza de forma asíncrona. Esto significa que tu aplicación no ha de esperar a que el método Write finalice su ejecución antes de continuar con la siguiente línea de código. Este comportamiento permite que tu aplicación siga mostrándose ágil y respondiendo a las interacciones del usuario.
Este ejemplo envía el texto de una TextArea a través del dispositivo Serial:
SerialDevice.Write(TextArea1.Text)
Si quieres esperar a que se envíen todos los datos antes de proceder con la ejecución de la siguiente línea de código, puedes invocar el método XmitWait antes de llamar a Write:
SerialDevice.XmitWait
SerialDevice.Write(TextArea1.Text)
Cambiar la configuración del puerto Serie
Hay ocasiones en las que probablemente necesites cambiar las propiedades correspondientes al comportamiento del controlador Serial mientras que el puerto permanece abierto. Si bien puedes cambiar dichas propiedades, los cambios propiamente dichos no se aplicarán hasta que se cierre el puerto y se vuelva a abrir nuevamente. Si necesitas que las propiedades de comportamiento se actualicen de inmediato, entonces puedes invocar el método Poll. Dicho método se encarga de actualizar todas las propiedades de inmediato e invoca el manejador de evento DataAvailable de inmediato en el caso de que se encuentren datos esperando en el buffer.
SerialDevice.Poll
Cerrar el Puerto
Una vez has finalizado la comunicación con el dispositivo serie has de cerrar el puerto serie para finalizar la sesión de comunicación, asegurándote así de que esté disponible para otros controladores Serial o bien otras aplicaciones.
Para cerrar el puerto Serial, llama al método Close usando el mismo controlador Serial utilizado a la hora de abrir el puerto:
SerialDevice.Close
Comunicar con dispositivos USB, Bluetooth y FireWire
En general, los dispositivos USB, Bluetooth y FireWire utilizan una interfaz completamente diferente que, por lo general, requiere de controladores para comunicarse con ellos. Una vez dicho esto, muchos de estos dispositivos tienen un chip que les permite mostrarse y comportarse como si fuesen dispositivos serie. Este chip es generalmente un chip FTDI, para el cual están disponibles una serie de controladores.
Si tu dispositivo no está reconocido como dispositivo serie, entonces deberías de investigar usando el plugin MonkeyBread Software, el cual proporciona soporte USB para determinados tipos de dispositivos.
Información sobre USB
USB aglutina varias cosas en una:
- Una especificación de interconexión de cable (la configuración del cable propiamente dicha)
- Un protocolo de bajo nivel orientado a paquetes, de modo que el sistema operativo pueda saber qué controlador cargar y hablar con el dispositivo USB para identificarlo
- Una API del fabricante; es decir, un dispositivo HID, como un ratón, un teclado o dispositivo de almacenamiento
Sólo porque algo utiliza un cable USB no significa que puedas hablar con él. Algunos tipos de dispositivos son muy comunes, de modo que los proveedores de sistemas operativos incluyen los controladores para ellos. Esto incluye los dispositivos HID (como ratones y teclados) y los dispositivos de almacenamiento como discos duros. Si este es uno de ellos, entonces funcionará sin trabajo adicional.
Prácticamente cualquier otro dispositivo requerirá de un controlador por parte del fabricante. Si quieres controlar dichos dispositivos, entonces tendrás que obtener una librería compartida por parte del fabricante o escribir tu propia librería. Prueba a contactar con el fabricante para comprobar si tiene una librería. Si el fabricante tiene una librería para comunicaciones USB, entonces podrás comunicarte con la librería mediante el uso de instrucciones Declare.
Uso de Serial con aplicaciones Web
Las aplicaciones Web pueden utilizar la clase Serial para comunicarse con dispositivos serie que estén conectados al servidor web. No se puede usar la calse Serial para comunicarse con los dispositivos serie conectados al ordenador del usuario.
Información Adicional
Dirígete a estos temas y ejemplos para obtener información adicional sobre cómo usar dispositivos Serie:
Tutorial de Lector de Códigos de Barra
Ejemplos incluidos con el IDE de Xojo
Communication/Serial/Line State Change Tester
Communication/Serial/Serial Port Bar Code Reader Example
Communication/Serial/SerialLineIndicator