# Conectando mediante USB (CreateUsb)

Esta guía explica cómo establecer una conexión con un TPV Integrado usando el transporte USB (serie).

## ¿Qué es la conexión USB?

El modelo de conexión USB establece un enlace físico directo entre el sistema de automatización y el terminal TPV mediante una interfaz serie. Llamas a `CreateUsb` con los parámetros requeridos para tu plataforma; la función devuelve una instancia de Connector que expone las mismas funciones de operación de dispositivo que los conectores HTTP.

## Cuándo usar la conexión USB

Usa una conexión USB cuando:

* El terminal TPV esté físicamente cerca del sistema de automatización
* La conectividad de red no esté disponible o esté restringida
* Se requiera una conexión directa, punto a punto

El USB ofrece un canal simple y determinista, pero es sensible a la desconexión física: si se desconecta el cable, el canal se pierde y debes restablecerlo.

<Callout type="warning">

Si usas `setupParams` (Kotlin) o el comando Setup (.NET) con el terminal, revisa las secciones de comportamiento de reconexión de esta documentación.

</Callout>

## Antes de comenzar

Antes de conectar por USB, asegúrate de que:

* El terminal TPV esté encendido y configurado para el modo TPV Integrado
* El cable USB esté correctamente conectado entre el TPV y el sistema de automatización
* La biblioteca del TPV Integrado esté disponible en tu aplicación
* El sistema operativo reconozca el TPV como un dispositivo serie (por ejemplo, puerto COM en Windows, `/dev/ttyACM0` en Linux)

## Paso 1: Crear el USB Connector

Crea un Connector con `CreateUsb` usando el parámetro requerido para tu plataforma.

**Parámetros:**

| Parámetro | Tipo | Obligatorio | Descripción | Disponibilidad |
| :--- | :--- | :--- | :--- | :--- |
| `address` | string | Sí | La dirección del puerto serie local (por ejemplo, Windows: `COM1`, `COM3`; Linux: `/dev/ttyACM0`). | .NET |
| `usbDevice` | UsbDevice | Sí | Objeto de dispositivo Android para la conexión USB. | Kotlin |
| `setupParams` | HashMap&lt;String, String> | No | Configuración del terminal (por ejemplo, friendly name). Consulta la sección de flujo de reconexión para más detalles. | Kotlin |

**Ejemplo — C#:**

```csharp
Connector connector = Connector.CreateUsb("COM3");
```

**Ejemplo — Kotlin:**

```kotlin
fun setupConnectorInstance(context: Context): POSIntegrado? {
    val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
    
    // Retrieve available device for USB connection
    val deviceList: List<UsbDevice> = usbManager.deviceList.map { it.value }
    
    // Select a available device
    val selectedDevice = deviceList.firstOrNull()
    
    val connectorInstance = if (selectedDevice != null) {
        POSIntegrado.createUsb(
            context = context,
            usbDevice = selectedDevice,
            setupParams = hashMapOf(
                SetupParameters.SELLER_FRIENDLY_NAME to "My Store"
            )
        )
    } else {
        null
    }
    
    return connectorInstance
}
```

Cuando la llamada es exitosa, se devuelve una instancia de Connector. La conexión se inicializa, pero el terminal aún no se ha validado.

## Paso 2: Validar el terminal

Antes de ejecutar cualquier operación de dispositivo, valida el terminal con `Polling`:

```csharp
var pollingResult = connector.PollingAsync();
```

Procede solo si la respuesta de Polling indica que el terminal está listo.

## Paso 3: Ejecutar operaciones

Una vez validado, usa el Connector para ejecutar operaciones de dispositivo como `Sale`, `Refund` o `GetReports`. Solo se puede procesar una operación a la vez por Connector.

## Paso 4: Cerrar la conexión

Después de completar todas las operaciones, libera la conexión:

```csharp
connector.Close();
```

La instancia de Connector deja de ser válida después del cierre y no se puede reutilizar.

## Siguientes pasos

* [Modelos de conexión](/es/integrated-pos/first-steps-pos/connection-models) — Comparación de USB y red.
* [Connector y flujos de comunicación](/es/integrated-pos/core-concepts-pos/connector-communication-flows) — Regla del ciclo de vida y de ejecución secuencial.
* [Reconexión, Polling y resiliencia](/es/integrated-pos/core-concepts-pos/polling-reconnection) — Cuándo hacer polling y cómo funciona la reconexión.
* [Referencia de métodos y parámetros](/es/integrated-pos/reference/methods-parameters) — Lista detallada de parámetros y ejemplos de código para .NET y Kotlin.