# Extraer datos de un puerto usb hid



## curro92 (Nov 19, 2017)

Hola,
he comprado una estación meteorológica (PCE-FWS20), en la que se pueden descargar los datos desde la base al PC a través de un cable usb y un programa que corre en Windows. Yo uso Linux, y estoy mirando cómo solucionar eso.

¿Alquien tiene idea de cómo puedo sacar esos datos? He solido hacer programillas en C para comunicarme con un puerto usb serie de un Arduino (ttyUSB), pero no sé si es factible con un puerto usb de tipo HID como es el caso. Cuando conecto la base se crea un fichero "/dev/usb/hiddev0"
Agradezco cualquier ayuda.


----------



## Dr. Zoidberg (Nov 20, 2017)

Lo mas sencillo es que intentes ejecutar el programa Windows en Linux usando el Wine, porvque para comunicarte vos con la estacion es necesario que conozcas el protocolo entre ambos.


----------



## Ardogan (Nov 27, 2017)

En mi maquina aparece como /dev/hidraw0 cuando enchufo un mouse.  
Si hago  sudo cat /dev/hidraw0 cada vez que el muevo el mouse me aparecen datos en binario (caracteres raros).  
Solo al mover el mouse, supongo que debe ser por el perfil hid utilizado (algunos reportan eventos, otros reportan valores cada un intervalo de tiempo como puede ser el caso de la estación meteorológica).  
Se sale del comando cat con ctrl+C.


----------



## curro92 (Nov 27, 2017)

Hola,
muchas gracias por sus respuestas.

Prové con Wine, pero siempre al cargar me dice "problema con base de datos" y se cierra. No sé qué base de datos usa EasyWeather ni cómo se puede configurar.

He probado con sudo cat /dev/hidraw0 y sale basura cuando se mueve el ratón (que es usb), como dice el compañero *Ardogan*.









Cuando enchufo el usb de la base de la estación PCE-FWS20, aparecen dos puertos: * /dev/hidraw1* y otro que es * /dev/usb/hiddev0*. Al desenchufar desaperecen también los dos. No sé el sentido de ello.

He instalado VirtualBox en mi Linux y ahora voy a probar a crear una máquina virtual instalando Windows XP dentro del mismo. Si eso funcionara, también resolvería tal vez el problema que tengo con mi impresora.

Comunicaré si hay novedades.


----------



## Ardogan (Nov 28, 2017)

Un link interesante: https://foro.tiempo.com/lo-que-puede-hacerse-con-una-pcefws-20-y-linux-t105804.0.html


----------



## curro92 (Nov 28, 2017)

Muchas gracias, por ahí deseo ir.


----------



## chipyz9 (Dic 19, 2019)

Buenas a todos, quisiera que alguien me respondiera una duda que tengo, estoy trabajando en un proyecto con el pic18f4550 en MikroC en el cual planeo utilizar el USB hid y hacer una comunicación con visual basic, ya he realizado dicha comunicación y funciona bien mandando números (enteros) y letras como Char, el problema está en qué cuando quiero enviar una cadena no sé cómo hacer la recepción en visual basic, ya que cuando mando una letra Char simplemente hago una conversión en visual basic, pero no tengo idea de cómo se hace o si se puede hacer lo mismo con strings, es decir, enviar y recibir datos de tipo String tanto de visual al pic y viceversa. Muchas gracias de antemano


----------



## D@rkbytes (Dic 20, 2019)

Como en HID se usa un arreglo para enviar y recibir los datos, en la interfaz los puedes interpretar o convertir como quieras.
No es lo mismo que en CDC que funciona similar al puerto serie.
Así que estando los datos dentro de un arreglo, ya no se podría considerar enviar o recibir una cadena.

Por ejemplo, envío de datos en HID:

```
// Nota: El primer dato se coloca en el offset 0 del búfer.
                // La PC lo recibe en el offset 1 del búfer.
                buffer_output[0]    = ident1;
                buffer_output[1]    = ident2;
                buffer_output[2]    = puerta;
                buffer_output[3]    = presion;
                buffer_output[4]    = bmp180_temp_msb;
                buffer_output[5]    = bmp180_temp_lsb;
                buffer_output[6]    = dht22_hum_msb;
                buffer_output[7]    = dht22_hum_lsb;
                buffer_output[8]    = mb_byte1;
                buffer_output[9]    = mb_byte2;
                buffer_output[10]    = mb_byte3;
                buffer_output[11]    = mb_byte4;
                buffer_output[12]    = ds18b20_temp_msb;
                buffer_output[13]    = ds18b20_temp_lsb;
```
Y en la interfaz los recibes así:

```
bTemp_DS18B20(0) = BufferIn(13)    ' MSB de la temperatura.
            bTemp_DS18B20(1) = BufferIn(14)    ' LSB de la temperatura.
            ' Etc...
```
Envío de datos en CDC que sí se podría considerar enviar una cadena:

```
printf(usb_cdc_putc,"$?%c%c%c%c%c%c%c%c%c%c%c%c",
        puerta,presion,
        bmp180_temp_msb,bmp180_temp_lsb,
        dht22_hum_msb,dht22_hum_lsb,
        mb_byte1,mb_byte2,mb_byte3,mb_byte4,
        ds18b20_temp_msb,ds18b20_temp_lsb);  // 14 Bytes en esta cadena.
```
Y en la interfaz sí los puedes recibir como una cadena:

```
szCadenaRx = Empty
    
    LenBytes = 30   ' Hasta el momento, 31 Bytes.
    
    lRet = CommRead(CInt(ComPort), szCadenaRx, CLng(LenBytes))

    If lRet <> 0 Then
        LenCadena = Len(szCadenaRx)
    ElseIf lRet < 0 Then
        lblEstados.Caption = "Error en la recepción de datos."
    End If
        
    ' Debug.Print LenCadena
    If LenCadena <> LenBytes Then Exit Sub
    
    ByteIdent1Rx = Mid(szCadenaRx, 1, 1)
    ByteIdent2Rx = Mid(szCadenaRx, 2, 1)
    
    If ByteIdent1Rx = "$" And ByteIdent2Rx = "?" Then
        Sensor_Puerta = Asc(Mid(szCadenaRx, 3, 1))
        Sensor_Presion = Asc(Mid(szCadenaRx, 4, 1))
    
        ' Recepción de datos de la temperatura ambiente (DHT11)
        BMP180_Temp(0) = Asc(Mid(szCadenaRx, 5, 1)) ' MSB de la temperatura BMP180
        BMP180_Temp(1) = Asc(Mid(szCadenaRx, 6, 1)) ' LSB de la temperatura BMP180
        ' Recepción de datos de la humedad relativa (DHT11)
        BMP180_Humedad(0) = Asc(Mid(szCadenaRx, 7, 1))  ' MSB de la humedad BMP180
        BMP180_Humedad(1) = Asc(Mid(szCadenaRx, 8, 1))  ' LSB de la humedad BMP180
        ' Etc..
```

Así que tienes dos opciones: envías la "cadena" dentro del arreglo o cambias de HID a CDC.


----------

