<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1815-5928</journal-id>
<journal-title><![CDATA[Ingeniería Electrónica, Automática y Comunicaciones]]></journal-title>
<abbrev-journal-title><![CDATA[EAC]]></abbrev-journal-title>
<issn>1815-5928</issn>
<publisher>
<publisher-name><![CDATA[Universidad Tecnológica de La Habana José Antonio Echeverría, Cujae]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1815-59282013000200001</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Comunicación USB entre aplicaciones desarrolladas en LabVIEW y microcontroladores de Silicon Labs]]></article-title>
<article-title xml:lang="en"><![CDATA[USB communication between applications developed in LabVIEW and Silicon Labs microcontrollers]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Herrera Benítez]]></surname>
<given-names><![CDATA[Julio César]]></given-names>
</name>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Centro de Investigación y Desarrollo Técnico  ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
<country>Cuba</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>08</month>
<year>2013</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>08</month>
<year>2013</year>
</pub-date>
<volume>34</volume>
<numero>2</numero>
<fpage>1</fpage>
<lpage>8</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S1815-59282013000200001&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S1815-59282013000200001&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S1815-59282013000200001&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[El presente artículo trata sobre la utilización de LabVIEW para establecer comunicación USB con microcontroladores de la familia 8051 de Silicon Laboratories, utilizando un driver desarrollado por dicha compañía. En el documento se incluye una descripción de este driver, así como de las funciones principales que permiten el manejo del mismo, las cuales se encuentran en una biblioteca de enlace dinámico. El artículo contiene además una metodología básica para el uso de estas funciones y una explicación detallada a través de un ejemplo, donde se ilustra como cargar y configurar las mismas con el ambiente de desarrollo LabVIEW. Finalmente se muestran dos ejemplos de la utilización del driver a partir de una biblioteca de funciones USB creada en LabVIEW para la comunicación con un microcontrolador.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[This article is about USB communication establishes between LabVIEW and Silicon Laboratories microcontrollers 8051 family, using a driver developed by this company. This paper includes a driver description and description of the main functions that allow the management of it, which are in a dynamic link library. The article also contains a basic methodology for the use of these functions and a detailed explanation through an example of how to load and configure them using the LabVIEW development environment. Finally shows two examples of the driver use from a USB library created in LabVIEW to communicate with a microcontroller.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[LabVIEW]]></kwd>
<kwd lng="es"><![CDATA[driver]]></kwd>
<kwd lng="es"><![CDATA[comunicación USB]]></kwd>
<kwd lng="es"><![CDATA[microcontrolador]]></kwd>
<kwd lng="es"><![CDATA[silab]]></kwd>
<kwd lng="es"><![CDATA[DLL]]></kwd>
<kwd lng="en"><![CDATA[LabVIEW]]></kwd>
<kwd lng="en"><![CDATA[driver]]></kwd>
<kwd lng="en"><![CDATA[USB communication]]></kwd>
<kwd lng="en"><![CDATA[microcontroller]]></kwd>
<kwd lng="en"><![CDATA[silab]]></kwd>
<kwd lng="en"><![CDATA[DLL]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <div align="right"><font size="2" face="Verdana"> <strong>ARTICULO ORIGINAL</strong></font>  </div>    <P>&nbsp;</P>    <P><font size="4" face="Verdana"><b>Comunicaci&oacute;n USB entre  aplicaciones desarrolladas en LabVIEW y microcontroladores de Silicon Labs</b></font></P>    <P>&nbsp;</P>    <P><strong><font size="3"><span id="result_box" lang="en"><font face="Verdana">USB  communication between applications developed in LabVIEW and Silicon Labs microcontrollers</font></span></font></strong></P>    <P>&nbsp;</P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana"><b>Ing.  Julio C&eacute;sar Herrera Ben&iacute;tez</b></font></P>    <P><font size="2" face="Verdana">  Centro de Investigaci&oacute;n y Desarrollo T&eacute;cnico, La Habana, Cuba, <a href="mailto:julio@inf.cidt.mnt">julio@inf.cidt.mnt</a>.  </font></P>    <P>&nbsp;</P>    ]]></body>
<body><![CDATA[<P>&nbsp;</P><hr>     <P><font size="2" face="Verdana"><B>RESUMEN </B>  </font></P>    <P><font size="2" face="Verdana">El presente art&iacute;culo trata  sobre la utilizaci&oacute;n de LabVIEW para establecer comunicaci&oacute;n USB  con microcontroladores de la familia 8051 de Silicon Laboratories, utilizando  un driver desarrollado por dicha compa&ntilde;&iacute;a. En el documento se incluye  una descripci&oacute;n de este driver, as&iacute; como de las funciones principales  que permiten el manejo del mismo, las cuales se encuentran en una biblioteca de  enlace din&aacute;mico. El art&iacute;culo contiene adem&aacute;s una metodolog&iacute;a  b&aacute;sica para el uso de estas funciones y una explicaci&oacute;n detallada  a trav&eacute;s de un ejemplo, donde se ilustra como cargar y configurar las mismas  con el ambiente de desarrollo LabVIEW. Finalmente se muestran dos ejemplos de  la utilizaci&oacute;n del driver a partir de una biblioteca de funciones USB creada  en LabVIEW para la comunicaci&oacute;n con un microcontrolador. </font></P>    <P><font size="2" face="Verdana"><strong>Palabras  Claves:</strong> LabVIEW, driver, comunicaci&oacute;n USB, microcontrolador, silab,  DLL.    <br> </font></P><hr>     <P><font size="2" face="Verdana"><B>ABSTRACT</B></font></P>    <P>  <font size="2" face="Verdana">This article is about USB communication establishes  between LabVIEW and Silicon Laboratories microcontrollers 8051 family, using a  driver developed by this company. This paper includes a driver description and  description of the main functions that allow the management of it, which are in  a dynamic link library. The article also contains a basic methodology for the  use of these functions and a detailed explanation through an example of how to  load and configure them using the LabVIEW development environment. Finally shows  two examples of the driver use from a USB library created in LabVIEW to communicate  with a microcontroller.</font></P>    <P><font size="2"><font face="Verdana"><strong>KeyWords:</strong>  LabVIEW, driver, USB communication, microcontroller, silab, DLL.    <br> </font></font></P><hr>      <p>&nbsp;</p>    ]]></body>
<body><![CDATA[<p>&nbsp;</p>    <p><font size="2"><b><font size="3" face="Verdana">INTRODUCCION</font></b></font></p>    <P>&nbsp;</P>    <P><font size="2" face="Verdana">La  transmisi&oacute;n de datos utilizando Bus Serie Universal (USB) es de gran importancia  debido a la facilidad de uso, velocidad de transmisi&oacute;n y su mayor presencia  en las PC actuales. Silicon Laboratories es una compa&ntilde;&iacute;a que incluye  entre sus productos de base amplia a los microcontroladores 8051 con interfaz  de comunicaci&oacute;n USB. </font></P>    <P><font size="2" face="Verdana">Silicon  Laboratories suministra un Kit de desarrollo USBXpress que constituye una herramienta  para la comunicaci&oacute;n USB entre los dispositivos de las familias C8051F32x,  C8051F34x, C8051F38x, CP210x y la PC. Esta herramienta incluye la creaci&oacute;n  de un driver para Windows, instalador del driver que se crea, librer&iacute;a  de funciones API (Application Program Interface, por sus siglas en ingl&eacute;s)  para el host que se encuentran en forma de DLL (Dinamic Link Library, por sus  siglas en ingl&eacute;s), y funciones para la interfaz del firmware (estas solamente  para dispositivos C8051F32x/34x/38x) <SUP>6</SUP>. </font></P>    <P><font size="2" face="Verdana">LabVIEW  constituye un revolucionario entorno de programaci&oacute;n gr&aacute;fica para  aplicaciones que involucren adquisici&oacute;n, control, an&aacute;lisis y presentaci&oacute;n  de datos. Una de las principales ventajas que proporciona el empleo de LabVIEW  es la posibilidad de</font><font size="2" face="Verdana">incorporar aplicaciones  escritas en otros lenguajes y aplicaciones tales como: DLL (librer&iacute;as de  funciones), .NET, ActiveX, Multisim, Matlab/Simulink, entre otras <SUP>1 2</SUP>.  </font></P>    <P><font size="2" face="Verdana">El objetivo de este trabajo es mostrar  c&oacute;mo establecer una comunicaci&oacute;n con los microcontroladores de Silab  a trav&eacute;s de bus USB para el desarrollo de aplicaciones que requieran el  trasiego de datos desde y hacia la PC. Adem&aacute;s que esta comunicaci&oacute;n  se realice con el software de aplicaci&oacute;n LabVIEW de forma eficiente y que  permita la reutilizaci&oacute;n del c&oacute;digo por otros usuarios. </font></P>    <P>&nbsp;</P>    <P><font size="3" face="Verdana"><B>CONTENIDO</B>  </font></P>    <P>&nbsp;</P>    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">De forma abreviada, la comunicaci&oacute;n  entre la interfaz del host con el dispositivo USB (<a href="#f1">Figura 1</a>)  se realiza a trav&eacute;s de las funciones API que se encuentran en la DLL. Estas  funciones API son las que manejan el driver USBXpress, este a su vez interact&uacute;a  con el firmware del dispositivo. El firmware opera el controlador USB de los microcontroladores  a <I>&#171;Full Speed&#187;</I> (12 Mbps) y usa transferencias tipo Bulk. </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0101213.jpg" width="336" height="422"><a name="f1"></a></P>    
<P>&nbsp;</P>    <P><font size="2"><b><font size="3" face="Verdana">FUNCIONES  DE LA API</font></b></font></P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana">La biblioteca  din&aacute;mica que proporciona <I>Silab</I> contiene una gran cantidad de funciones,  entre las m&aacute;s utilizadas podemos encontrar: </font></P>    <P><font size="2" face="Verdana">&#183;  Funci&oacute;n para saber el n&uacute;mero de dispositivos USB conectados (que  usan ese driver). SI_GetNumDevices(). </font></P>    <P><font size="2" face="Verdana">&#183;  Funci&oacute;n que devuelve los descriptores USB del dispositivo. SI_GetProductString().  </font></P>    <P><font size="2" face="Verdana">&#183; Funciones que permiten abrir  y cerrar una instancia con el dispositivo. SI_Open(), SI_Close(). </font></P>    <P><font size="2" face="Verdana">&#183;  Funciones que permiten la lectura y escritura desde o hacia el dispositivo USB.  SI_Read(), SI_Write(). </font></P>    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">&#183; Funciones  que devuelven el estado y el n&uacute;mero de bytes en la cola de recepci&oacute;n.  SI_CheckRXQueue(). </font></P>    <P><font size="2" face="Verdana">De forma general  para utilizar estas funciones e iniciar una comunicaci&oacute;n con un dispositivo  USB, el usuario primero debe utilizar la funci&oacute;n <I>SI_GetNumDevices()</I>  para saber si existe alg&uacute;n dispositivo conectado. Si hubiese uno conectado,  entonces esta funci&oacute;n nos devuelve un valor distinto de cero por lo que  el usuario puede, con la funci&oacute;n <I>SI_GetProductString()</I>,conocer los  par&aacute;metros del descriptor tales como: n&uacute;mero de serie, descripci&oacute;n  del producto, ID del producto y del fabricante, entre otras <SUP>5</SUP>. Estos  </font><font size="2" face="Verdana">descriptores del dispositivo USB son personalizados  mediante el conjunto de funciones de interface durante la programaci&oacute;n  de microcontrolador.</font></P>    <P><font size="2" face="Verdana">Como se detect&oacute;  un equipo conectado entonces es posible establecer una comunicaci&oacute;n con  el mismo, para ello se utiliza la funci&oacute;n <I>SI_Open()</I> que le devuelve  al usuario un <I>Handle</I>, utilizado en las operaciones subsiguientes <SUP>5</SUP>.  </font></P>    <P><font size="2" face="Verdana">La transmisi&oacute;n de los datos  se hace utilizando las funciones <I>SI_Read() </I>y<I> SI_Write()</I> para las  operaciones de lectura y escritura respectivamente desde y hacia el microcontrolador.  Para saber cu&aacute;ndo efectuar la lectura el usuario puede auxiliarse adem&aacute;s,  de la funci&oacute;n <I>SI_CheckRXQueue()</I> que retorna el estado de la cola  de recepci&oacute;n y el n&uacute;mero de bytes presentes en la misma. Puede auxiliarse  tambi&eacute;n de la funci&oacute;n <I>SI_FlushBuffers()</I> que limpia los buffers  de transmisi&oacute;n en el dispositivo y de recepci&oacute;n en la PC. En caso  de no realizar ninguna otra acci&oacute;n se cierra la comunicaci&oacute;n con  la ayuda de la funci&oacute;n <I>SI_Close() </I><SUP>5</SUP>. </font></P>    <P>&nbsp;</P>    <P>      <P><font size="3" face="Verdana"><B>COMO UTILIZAR LAS FUNCIONES DE LA API CON  LABVIEW </B> </font>     <P>&nbsp;</P>    <P><font size="2" face="Verdana">Como se dijo anteriormente,  el LabVIEW proporciona algunas opciones para la interconexi&oacute;n con c&oacute;digos  creados en otros lenguajes. Una de las formas m&aacute;s comunes de encontrar  c&oacute;digo externo es en forma de DLL, las cuales pueden ser ejecutadas por  el LabVIEW haciendo uso de <I>Call Library Function Node</I> (<a href="#f2">Figura  2</a>). Con esta funci&oacute;n nodo se puede hacer uso de la biblioteca proporcionada  por <I>Silab</I>, defini&eacute;ndosele la funci&oacute;n API a utilizar. </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0201213.jpg" width="326" height="178"><a name="f2"></a></P>    
]]></body>
<body><![CDATA[<P>&nbsp;</P>    <P><font size="2" face="Verdana">Para  configurar la funci&oacute;n anterior se da doble clic sobre la misma e inmediatamente  se despliega una ventana que permite llenar los campos que la componen (<a href="#f3">Figura  3</a>). En la pesta&ntilde;a <I>Function</I> se introduce la direcci&oacute;n  de la DLL de <I>Silab</I> as&iacute; como se selecciona la funci&oacute;n a utilizar,  en este caso vamos a seleccionar como ejemplo la funci&oacute;n de escritura <I>SI_Write</I>.  </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0301213.jpg" width="470" height="370"><a name="f3"></a></P>    
<P><font size="2" face="Verdana">Tambi&eacute;n  se especifica si la funci&oacute;n puede ser llamada de forma reentrante, es decir,  que pueda ser ejecutada varias veces de forma simult&aacute;nea. En sistemas operativos  multi-hilos es posible hacer m&uacute;ltiples llamados a una DLL simult&aacute;neamente.  Para que la funci&oacute;n se pueda ejecutar de forma reentrante se selecciona  la opci&oacute;n <I>&#171;Thread&#187;</I> como <I>&#171;Run in UI Thread&#187;</I>,  que establece o crea un hilo de ejecuci&oacute;n independiente para la funci&oacute;n  <SUP>1 3</SUP>. </font></P>    <P><font size="2" face="Verdana">En la pesta&ntilde;a  <I>Parameters</I> de la misma ventana se van agregando los par&aacute;metros de  entrada y salida a dicha funci&oacute;n con sus tipos de datos (<a href="#f4">Figura  4</a>). En el caso del ejemplo que se viene implementando de la funci&oacute;n  <I>SI_Write</I>, se le definen los valores con sus respectivos campos: </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0401213.jpg" width="530" height="404"><a name="f4"></a></P>    
<P>&nbsp;</P>    <P><font size="2" face="Verdana"><B>Valores  de entrada</B> </font></P>    <P><font size="2" face="Verdana">1. El Handle que nos  devolviera la funci&oacute;n <I>SI_Open</I>. </font></P>    <P><font size="2" face="Verdana">a.  Type: Numeric. </font></P>    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">b. Data Type: Unsigned  32-bit Integer. </font></P>    <P><font size="2" face="Verdana">c. Pass: Value. </font></P>    <P><font size="2" face="Verdana">2.  El buffer con los datos a escribir. </font></P>    <P><font size="2" face="Verdana">a.  Type: Array. </font></P>    <P><font size="2" face="Verdana">b. Data Type: Unsigned  8-bit Integer. </font></P>    <P><font size="2" face="Verdana">c. Array Format: Array  Data Pointer. </font></P>    <P><font size="2" face="Verdana">3. El tama&ntilde;o  en bytes de los datos a escribir. </font></P>    <P><font size="2" face="Verdana">a.  Data Type: Unsigned 32-bit Integer. </font></P>    <P><font size="2" face="Verdana">b.  Pass: Value. </font></P>    <P><font size="2" face="Verdana"><B>Como valor de salida  devuelve:</B> </font></P>    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">1. La cantidad en bytes  de datos escritos. </font></P>    <P><font size="2" face="Verdana">a. Type: Numeric.  </font></P>    <P><font size="2" face="Verdana">b. Data Type: Unsigned 32-bit Integer.  </font></P>    <P><font size="2" face="Verdana">c. Pass: Value. </font></P>    <P><font size="2" face="Verdana">2.  El valor de retorno. </font></P>    <P><font size="2" face="Verdana">a. Type: Numeric.  </font></P>    <P><font size="2" face="Verdana">b. Data Type: Unsigned 32-bit Integer.  </font></P>    <P><font size="2" face="Verdana">El valor de retorno nos indica si  la operaci&oacute;n tuvo &eacute;xito o no, este es un valor codificado que ante  la ocurrencia de un problema nos informa de su procedencia. </font></P>    <P><font size="2" face="Verdana">Toda  esta operaci&oacute;n se hace con ayuda de la informaci&oacute;n suministrada  para la DLL, adem&aacute;s se debe tener en cuenta los tipos de datos de C y su  correspondencia en LabVIEW. En <SUP>4</SUP> se puede encontrar m&aacute;s informaci&oacute;n  referente a los tipos de datos que soporta el LabVIEW provenientes de librer&iacute;as  compartidas. </font></P>    <P><font size="2" face="Verdana">Finalmente la funci&oacute;n  de escritura quedar&iacute;a parametrizada como se muestra en la <a href="#f5">Figura  5</a>. Solo resta guardarlo como un SubVI para su reutilizaci&oacute;n futura.  Estos subVI pueden ser configurados tambi&eacute;n para ser llamados de forma  reentrante, para ello solo hay que ir a las propiedades del mismo y en la categor&iacute;a  <I>&#171;Execution&#187;</I> seleccionar <I>&#171;Reentrant execution&#187;</I>.  </font></P>    ]]></body>
<body><![CDATA[<P align="center"><img src="/img/revistas/eac/v34n2/f0501213.jpg" width="428" height="274"><a name="f5"></a></P>    
<P>&nbsp;</P>    <P><font size="2"><b><font size="3" face="Verdana">BIBLIOTECA  DE FUNCIONES USB EN LABVIEW</font></b></font></P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana">Si  se repite el proceso del ep&iacute;grafe anterior para cada una de las API deseadas,  se obtienen una serie de SubVIs que pueden ser utilizados en la creaci&oacute;n  de una biblioteca personalizada de funciones USB. Por ejemplo, se toman los SubVIs  creados y se introducen dentro de una carpeta que puede ser llamada &#171;USB&#187;.  Est&aacute; carpeta puede ser incluida como una subpaleta dentro de la paleta  principal de funciones de LabVIEW, copiando la misma en la carpeta de componentes  de usuario, que se encuentra en la direcci&oacute;n donde se instala el software  de <I>National Instruments</I>. Finalmente quedar&iacute;a como se muestra en  la <a href="#f6">figura 6</a>. </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0601213.jpg" width="484" height="262"><a name="f6"></a></P>    
<P>&nbsp;</P>    <P><font size="2" face="Verdana">En  la <a href="#f7">figura 7</a> se muestra un ejemplo de posible c&oacute;digo de  uno de los subVI que conforman esta biblioteca, espec&iacute;ficamente el que  realiza la operaci&oacute;n de lectura. Una vez que se establecen los par&aacute;metros  de entrada y salida de la funci&oacute;n <I>&#171;SI_Read&#187;</I> en el <I>Call  Library Function Node</I>, se le agregan entonces los controles e indicadores  que representan las entradas y salidas de este subVI. A la funci&oacute;n de lectura  se le pasa el handle y el n&uacute;mero de bytes a recibir, y devuelve el handle,  el valor de retorno, el buffer con los datos le&iacute;dos en bytes y la cantidad  de bytes retornados. Este &uacute;ltimo par&aacute;metro se utiliza para verificar  que la cantidad de datos en bytes fijada por el usuario coincide con la cantidad  real de datos adquiridos, si no hay coincidencia entonces el indicador booleano  toma valor verdadero. </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0701213.jpg" width="572" height="244"><a name="f7"></a></P>    
<P>&nbsp;</P>    ]]></body>
<body><![CDATA[<P><font size="2"><b><font face="Verdana">Ejemplos  </font></b></font></P>    <P><font size="2" face="Verdana">En este ac&aacute;pite  se muestran dos ejemplos pr&aacute;cticos del uso que tienen los VIs creados para  la comunicaci&oacute;n con uno de los micros de <I>Silab</I> con interfaz de comunicaci&oacute;n  USB, supongamos el <I>C8051F320</I>. </font></P>    <P><font size="2" face="Verdana">El  primero es un ejemplo de <B>lectura</B> de datos enviados desde el microcontrolador  (<a href="/img/revistas/eac/v34n2/f0801213.jpg">Figura 8</a>). Supongamos  que el <I>C8051F320</I> se encuentra midiendo los valores de temperatura de cuatro  sensores ubicados en el interior de un local. El microcontrolador digitaliza peri&oacute;dicamente  los valores de tensi&oacute;n de los cuatro sensores y los env&iacute;a por USB  hacia la PC. Para recibir estos valores, lo primero que debemos hacer es crear  una nueva instancia a partir de la existencia de un dispositivo conectado utilizando  el VI <I>SI_Open</I> que nos devuelve un Handle. Siguiendo el flujo de datos de  la <A HREF="#f7">figura 7</A>, se entra a un ciclo de espera donde se utiliza  el VI <I>SI_CheckRXQueue()</I> para determinar la cantidad de bytes presentes  en la cola de recepci&oacute;n. Este es un VI al que se le pasa como entradas  el handle obtenido y la cantidad de bytes a chequear, y nos devuelve la cantidad  de bytes contenidos en la cola, un booleano que es verdadero si esta cantidad  es mayor o igual a la cantidad a chequear y el valor de retorno para verificar  si la operaci&oacute;n es correcta. En el ejemplo si el booleano se hace verdadero  es que est&aacute;n los bytes en la cola listos para leerlos y por lo tanto se  sale del ciclo de espera. Se realiza la lectura con el VI <I>SI_Read()</I>, descrito  en ep&iacute;grafe anterior. En <SUP>5</SUP> se aclara que el n&uacute;mero m&aacute;ximo  de bytes a leer desde el dispositivo en un ciclo no puede ser mayor que 64 kB.  Con los bytes le&iacute;dos se puede realizar cualquier operaci&oacute;n de procesamiento  o simplemente indicar los valores de temperatura en controles del panel frontal  de la aplicaci&oacute;n. Terminada la lectura se cierra la comunicaci&oacute;n  con el dispositivo empleando el VI <I>SI_Close</I>. </font></P>    
<P><font size="2" face="Verdana">El  segundo es un ejemplo de escritura de datos hacia el microcontrolador (<a href="#f9">Figura  9</a>), donde al igual que en el caso anterior usamos las funciones <I>SI_Open  </I>y<I> SI_Close</I> para abrir y cerrar la comunicaci&oacute;n con el micro.  Supongamos ahora que en este ejemplo queremos enviar la informaci&oacute;n de  control correspondiente a una o varias v&aacute;lvulas que el microcontrolador  maneja. Para ello, una vez obtenido el handle y siguiendo el flujo de datos se  ejecuta el VI <I>SI_Write</I> que llama la funci&oacute;n de escritura, al mismo  se le pasan como valores de entrada el handle anterior y los datos en forma de  arreglo U8 (entero sin signo de 8 bits). Este VI tiene como valores de salida  un booleano que permite verificar la veracidad de la escritura, es decir, que  toma verdadero si la cantidad de datos a escribir fue igual a la cantidad escrita.  El VI <I>SI_Write</I> tambi&eacute;n devuelve el valor de retorno de la funci&oacute;n  que utilizamos para saber si la operaci&oacute;n fue correctamente ejecutada.  En <SUP>5</SUP> se dice que el n&uacute;mero m&aacute;ximo de bytes a escribir  en un ciclo no puede ser mayor que 4096 Bytes. </font></P>    <P align="center"><img src="/img/revistas/eac/v34n2/f0901213.jpg" width="576" height="276"><a name="f9"></a></P>    
<P>&nbsp;</P>    <P><font size="2"><b><font size="3" face="Verdana">CONCLUSIONES</font></b></font></P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana">LabVIEW  es un software que permite ejecutar c&oacute;digo externo y una de las funciones  que utiliza para ello es <I>Call Library Function Node</I>. Para la configuraci&oacute;n  de este, se debe seleccionar la funci&oacute;n de la DLL a utilizar y se le agregan  los par&aacute;metros de entrada y salida con sus tipos de datos. </font></P>    <P><font size="2" face="Verdana">A  partir de la configuraci&oacute;n de estas funciones es posible crear una biblioteca  de subVIs en LabVIEW, que permitan establecer una comunicaci&oacute;n con la familia  de <I>Silicon Laboratories</I> que tienen bus de comunicaci&oacute;n USB (C8051F32x  y C8051F34x). </font></P>    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">Esta Biblioteca creada  en LabVIEW, que utiliza las funciones de la DLL suministrada por <I>Silab</I>,  puede ser de gran ventaja ya que permite acortar los tiempos de programaci&oacute;n  y la reutilizaci&oacute;n del c&oacute;digo por diferentes usuarios en gran cantidad  de aplicaciones con microcontroladores de esta familia. </font></P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana"><font size="3"><strong>REFERENCIAS  </strong></font></font></P>    <P>&nbsp;</P>    <!-- ref --><P><font size="2" face="Verdana">1. TRAVIS,  J.; KING, J. &#171;LabVIEW for Everyone&#187;, 3<SUP>rd</SUP> Edition. Prentice  Hall, 2007. 981 p. ISBN 0-13-185672-3</font><!-- ref --><P><font size="2" face="Verdana"><B>2.  </B>BITTER, R.; MOHIUDDIN, T.; NAWROCKI, M. LabVIEW<SUP>TM</SUP> Advanced Programming  Techniques. 2<SUP>nd</SUP> Edition.CRC Press, 2007. 499 p. ISBN 0-8493-3325-3  </font><!-- ref --><P><font size="2" face="Verdana"><B>3. </B>National Instruments, &#171;Using  External Code in LabVIEW&#187;, LabVIEW <SUP>TM </SUP>, April 2003 </font><!-- ref --><P><font size="2" face="Verdana"><B>4.  </B>National Instruments. LabVIEW Help &#171;Supported Data Types for the Import  Shared Library Wizard&#187;     </font></P>    <!-- ref --><P><font size="2" face="Verdana"><B>5.  </B>Silicon Laboratories Inc., &#171;USBXPRESS<SUP>&#174;</SUP> PROGRAMMER'S GUIDE&#187;    ,  Application Note 169, revision 2.0. 2008. </font></P>    <!-- ref --><P><font size="2" face="Verdana"><B>6.  </B>Silicon Laboratories. USBXpress&#174; Development Tools.     Visitado: 16-4-2012.  Disponible en: <A HREF="http://www.silabs.com/products/mcu/Pages/USBXpress.aspx" TARGET="_blank">http://www.silabs.com/products/mcu/Pages/USBXpress.aspx</A>  </font></P>    <P>&nbsp;</P>    <P>&nbsp;</P>    <P><font size="2" face="Verdana">Recibido: Abril 2013    <br>  Aprobado: Mayo 2013</font></P>    <P>&nbsp;</P>    <P>&nbsp;</P>    <P>&nbsp;</P>     ]]></body>
<body><![CDATA[ ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[TRAVIS]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[KING]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<source><![CDATA[LabVIEW for Everyone]]></source>
<year>2007</year>
<edition>3</edition>
<page-range>981</page-range><publisher-name><![CDATA[Prentice Hall]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BITTER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
<name>
<surname><![CDATA[MOHIUDDIN]]></surname>
<given-names><![CDATA[T.]]></given-names>
</name>
<name>
<surname><![CDATA[NAWROCKI]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[LabVIEWTM Advanced Programming Techniques]]></source>
<year>2007</year>
<edition>2</edition>
<page-range>499</page-range><publisher-name><![CDATA[CRC Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BITTER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Using External Code in LabVIEW]]></source>
<year>Apri</year>
<month>l </month>
<day>20</day>
<publisher-name><![CDATA[LabVIEW TM]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BITTER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Supported Data Types for the Import Shared Library Wizard]]></source>
<year></year>
<publisher-name><![CDATA[LabVIEW Help]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BITTER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[USBXPRESS® PROGRAMMER'S GUIDE]]></source>
<year></year>
<publisher-name><![CDATA[Silicon Laboratories Inc.]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BITTER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[USBXpress® Development Tools]]></source>
<year></year>
<publisher-name><![CDATA[Silicon Laboratories]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
