Está en la página 1de 5

jPicUSB: Clase Java para comunicacin USB con PICs usando API de Microchip

Oativia, Gernimo Isidro Universidad Nacional de Tucumn Facultad de Ciencias Exactas Ingeniera en Computacin geronimox@gmail.com - desarrollos@divideandconquer.com.ar - www.divideandconquer.com.ar

La mayora de los fabricantes de computadoras porttiles, y de escritorio, poco a poco estn jubilando al antiguo puerto serie; de la misma manera en que se dej en el olvido al antiguo puerto paralelo. De este echo surgi la necesidad, y casi obligacin, de migrar nuestros desarrollos a las nuevas tecnologas.

El puerto USB trae consigo muchas ventajas respecto a los antiguos puertos serie y paralelo, las ms notables son: Alta tasa de transferencia (mnimo 100 veces mayor al puerto serie) Hasta 127 dispositivos conectados en un mismo bus Es capaz de alimentar un perifrico con 500mA/5V Es Plug And Play y Hot Swapable Tambien no se debe dejar de lado que se ha convertido en un Standard en la Industria de Computadoras, por lo que es prcticamente imposible encontrar una PC sin un puerto USB a nuestra disposicin.

Esta ponencia no abordar el software del lado de un PIC, sino del lado de la PC, y especficamente desde una aplicacin Java, utilizando la clase jPicUSB para lograr la comunicacin PIC-PC. Que es jPicUSB? JPicUSB es una clase java, que utilizando interfaces nativas (JNI) [7], permite a una aplicacin Java hacer llamados a una librera dinmica, en este caso (jpicusb.dll). JPicUSB.dll es una librera que implementa todas las funciones de la API USB de Microchip [4] (mpusbapi.dll), con la diferencia de que est especialmente recompilada para permitir a la clase jPicUSB que haga llamados a sus funciones. Porque jPicUSB? El desarrollo rpido de aplicaciones e interfaces grficas es una de las cualidades ms notables de Java, pero este lenguaje, no nos proporciona un mtodo fcil para acceder a libreras dinmicas (.dll). Aqu es donde jPicUSB facilita el camino, como si se tratase de cualquier lenguaje.

Mtodos disponibles en JPicUSB


Ficheros que componen al paquete jPicUSB jpicusb.jar jpicusb.dll javadoc Interfaz java con la librera dinmica jpicusb.dll Librera dinmica que contiene todas las funciones de la API USB de Microchip [4] Carpeta con la documentacin de la clase. (Descripcin de todos los mtodos)

Distintos tipos de Mtodos disponibles en jpicusb.jar En la clase iface del Paquete jPicUSB podemos distinguir 3 tipos diferentes de mtodos. - Mtodos de inicializacin varios Cargan la librera dinmica y establecen valores por defecto. - Mtodos generales Lectura y Escritura de datos a un dispositivo USB, apertura de una conexin, etc. - Mtodos rpidos Imitan a los mtodos generales, pero con menos cdigo para agilizar el desarrollo. Cada uno de estos 3 tipos de mtodos estn descriptos a continuacin. Mtodos de inicializacin varios static void load( ) Carga la librera dinmica jpicusb.dll. Este mtodo debe ser llamado solo una vez, antes de cualquier llamada a otro mtodo. static void set_vidpid(java.lang.String s) Establece el VID&PID utilizado por defecto en toda llamada a un mtodo rpido. static void set_instance(int i) Establece la instancia utilizada por defecto en toda llamada a un mtodo rpido. Descripcin de los Mtodos rapidos en la clase jpicusb.jar Adems de las funciones proporcionadas por la API de Microchip [4], jPicUSB dispone de varios mtodos que agilizan el desarrollo. Estos mtodos rpidos se identifican gracias a que a su nombre le antecede el carcter Q (Quick). Antes de utilizar estos mtodos, es necesaria una simple configuracin de la librera utilizando los mtodos de inicializacin varios, descriptos en la lista anterior (set_vidpid y set_instance). Los mtodos rpidos disponibles son: static byte[ ] QRead (int dwLen, long dwMilliseconds) Establece una conexin al VID&PID por defecto, lee dwLen bytes, con un timeout de dwMilliseconds milisegundos y luego cierra la conexin. Retorna los bytes ledos en un arreglo de bytes. static long QWrite (byte[ ] pData, int dwLen, long dwMilliseconds) Establece una conexin al VID&PID por defecto, escribe dwLen bytes del arreglo pData, con un timeout de dwMilliseconds milisegundos y luego cierra la conexin. Retorna la cantidad de bytes que se escribieron con xito. static byte[ ] QWriteRead(byte[] pData, int dwLenWrite, int dwLenRead, long dwMilliseconds) Establece una conexin al VID&PID por defecto, escribe dwLenWrite bytes del arreglo pData, luego lee dwLenRead bytes, con un timeout de dwMilliseconds milisegundos y luego cierra la conexin. Retorna los bytes ledos en un arreglo de bytes.

Descripcion de los Mtodos generales en la clase jpicusb.jar Los mtodos generales, son aquellos que se comportan igual a las funciones proporcionadas por la API USB de Microchip [4], ya que se tratan de las mismas funciones, recompiladas de tal forma, que puedan ser accedidas desde la librera jPicUSB en Java. static int GetDeviceCount(java.lang.String pVID_PID) Retorna la cantidad de dispositivos que coinciden con pVID_PID. static long Open(int instance, java.lang.String pVID_PID, java.lang.String pEP, int dwDir, int dwReserved) Abre una conexin con el dispositivo cuyo VID&PID coincide con pVID_PID. Retorna una handle que identifica a la conexin para ser usada con los dems mtodos generales que requieren una conexin previamente establecida. static boolean Close(long handle) Cierra la conexin proporcionada. static byte[ ] Read(long handle, int dwLen, long dwMilliseconds) Lee dwLen bytes de la conexin proporcionada via el parmetro handle. Retorna un arreglo de bytes con los datos ledos. static long Write(long handle, byte[] pData, int dwLen, long dwMilliseconds) Escribe dwLen bytes de pData en la conexin proporcionada va el parmetro handle. Retorna un entero representando la cantidad de bytes escritos con xito. static byte[ ] Read(java.lang.String pVID_PID, int instance, int dwLen, long dwMilliseconds) Abre una conexin con el dispositivo cuyo VID&PID coincide con pVID_PID. Lee dwLen bytes de la conexin y luego cierra la conexin abierta. Retorna un arreglo de bytes con los datos ledos. static long Write(java.lang.String pVID_PID, int instance, byte[] pData, int dwLen, long dwMilliseconds) Abre una conexin con el dispositivo cuyo VID&PID coincide con pVID_PID. Escribe dwLen bytes de pData a la conexin y luego cierra la conexin abierta. Retorna un entero representando la cantidad de bytes escritos con xito. static byte[ ] WriteRead(java.lang.String pVID_PID, int instance, byte[] pData, int dwLenWrite, int dwLenRead, long dwMilliseconds) Abre dos pipes (uno de lectura y otro de escritura) con el dispositivo cuyo VID&PID coincide con pVID_PID. Envia dwLenWrite bytes de pData al dispositivo y luego lee dwLenRead bytes del mismo. Luego cierra la conexin. Retorna un arreglo de bytes con los datos ledos. Nota: Varios usuarios reportaron problemas al ejecutar el mtodo load. El problema se resolvi instalando los Runtimes de Visual C++ [6]

Usando jPicUSB en cuatro pasos


Pasos bsicos para la utilizacin de jPicUSB en un Proyecto Java de Netbeans [5]

Para utilizar jPicUSB en nuestras aplicaciones, es necesario aadir el paquete jpicusb.jar al proyecto.

Importar todos los paquetes contenidos en jPicUSB.

Inicializar la librera en el cdigo antes de usarla.

Y antes de ejecutar la aplicacin, copiar la librera jpicusb.dll al contexto en el cual se ejecuta nuestra aplicacin.

Anexos que acompaan esta ponencia: 1. jpicusb_1.1.1.rar Librera jPicUSB y su documentacin. 2. jPicUsb_1.1.1_Led_Show_Demo.rar Demostracin de jPicUSB en un proyecto en NetBeans, con simulacin de hardware utilizando PIC18F4550 en Proteus.

Vnculos de Interes:

1. Web del Proyecto: http://divideandconquer.com.ar/dyq/2009/01/jpicusb-comunicacion-pic-usb-usando-java/ 2. Tutorial de desarrollo de una aplicacin paso a paso con NetBeans y uso de jPicUSB http://www.ucontrol.com.ar/forosmf/programacion-en-java/tutorial-java-pic-usb-(primerospasos)/ 3. Video del proyecto de demostracin de la librera http://tinypic.com/player.php?v=2eb4awn&s=5 4. Microchip Aplication Libraries http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDoc Name=en540668 5. NetBeans IDE http://www.netbeans.org/ 6. Microsoft Visual C++ SP1 Redistributable Package http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D3802B2AF5FC2&displaylang=en 7. Java Native Interface http://es.wikipedia.org/wiki/Java_Native_Interface http://java.sun.com/j2se/1.5.0/docs/guide/jni/index.html