No se pueden recibir datos con libusb

chaitra

Quiero enviar y recibir datos del dispositivo a la PC y viceversa. Estoy enviando la cadena, pero no puedo recibirla por completo. Ejemplo: la cadena enviada es Helloy la salida es:

Received:H
Error in read! e = -4 and received = 5

#include <string.h>
    #include<stdio.h>
    #include <stdlib.h>
    #include <libusb-1.0/libusb.h>

    #define BULK_EP_OUT     0x01
    #define BULK_EP_IN      0x81

    /*find these values using lsusb -v*/

    uint16_t VENDOR = 0x0483;
    uint16_t PRODUCT = 0x5740;
    int main(void)
    {
        int ret = 1;    //int type result
       struct libusb_device **usb_dev;
    struct libusb_device_descriptor desc;
        struct libusb_device_handle *handle = NULL;
     struct device_handle_expected;
    //struct libusb_device_handle device_expected_handle = NULL;
        struct libusb_device *dev, *dev_expected; 
        char *my_string, *my_string1;
        int e = 0, config;
        char found = 0;
        int transferred = 0;
        int received = 0;
        int length = 0;
        int i=0;
        int count;

        /*struct libusb_device *dev;
        struct libusb_device **devs;
        struct dev_expected;*/

        // Initialize libusb
        ret = libusb_init(NULL);
        if(ret < 0)
        {
            printf("\nFailed to initialise libusb\n");
            return 1;
        }
        else
            printf("\nInit successful!\n");

        // Get a list of USB devices
        count = libusb_get_device_list(NULL, &usb_dev);
        if (count < 0)
        {
            printf("\nThere are no USB devices on the bus\n");
            return -1;
        }
        printf("\nToally we have %d devices\n", count);

        while ((dev = usb_dev[i++]) != NULL)
        {    

            ret = libusb_get_device_descriptor(dev, &desc);
            if (ret < 0)
                {
                printf("Failed to get device descriptor\n");
                libusb_free_device_list(dev, 1);
                break;
            }

            e = libusb_open(dev, &handle);
            if (e < 0)
            {
                printf("Error opening device\n");
                libusb_free_device_list(dev, 1);
                libusb_close(handle);
                break;
            }

            if(desc.idVendor == 0x0483 && desc.idProduct == 0x5740)
            {
               found = 1;
            break;
            }
        }//end of while
        if(found == 0)
        {
            printf("\nDevice NOT found\n");
            libusb_free_device_list(usb_dev, 1);
            libusb_close(handle);
            return 1;
        }
        else
        {
            printf("\nDevice found");
           // dev_expected = dev;
            //device_handle_expected = handle;
        }

        e = libusb_get_configuration(handle, &config);
        if(e!=0)
        {
            printf("\n***Error in libusb_get_configuration\n");
            libusb_free_device_list(usb_dev, 1);
            libusb_close(handle);
            return -1;
        }
        printf("\nConfigured value: %d", config);

        if(config != 1)
        {
            libusb_set_configuration(handle, 1);
            if(e!=0)
            {
                printf("Error in libusb_set_configuration\n");
                libusb_free_device_list(usb_dev, 1);
                libusb_close(handle);
                return -1;
            }
            else
                printf("\nDevice is in configured state!");
        }



        if(libusb_kernel_driver_active(handle, 0) == 1)
        {
            printf("\nKernel Driver Active");
            if(libusb_detach_kernel_driver(handle, 0) == 0)
                printf("\nKernel Driver Detached!");
            else
            {
                printf("\nCouldn't detach kernel driver!\n");
                libusb_free_device_list(usb_dev, 1);
                libusb_close(handle);
                return -1;
            }
        }

        e = libusb_claim_interface(handle, 0);
        if(e < 0)
        {
            printf("\nCannot Claim Interface");
            libusb_free_device_list(usb_dev, 1);
            libusb_close(handle);
            return -1;
        }
        else
            printf("\nClaimed Interface\n");

        int nbytes = 64;
        my_string = (char *) malloc(nbytes + 1);
        my_string1 = (char *) malloc(nbytes + 1);

        memset(my_string, '\0', 64);//The C library function void (an unsigned char) to the first n characters of the string pointed to, by the argument str.
        memset(my_string1, '\0', 64);

        strcpy(my_string, "Hello");
        length = strlen(my_string);

        printf("\nTo be sent: %s", my_string);

        e = libusb_bulk_transfer(handle, BULK_EP_OUT, my_string, length, &transferred, 0);
        if(e == 0 && transferred == length)
        {
            printf("\nWrite successful!");
            printf("\nSent %d bytes with string: %s\n", transferred, my_string);
        }
        else
            printf("\nError in write! e = %d and transferred = %d\n", e, transferred);

       // sleep(3);
       i = 0;

        for(i = 0; i <= length; i++)
        {
            e = libusb_bulk_transfer(handle, BULK_EP_IN, my_string1,length, &received, 0);  //64: Max Packet Length
            if(e == 0 && received == length)
            {
                printf("\nReceived:");
                printf("%c", my_string1[i]); 
             sleep(5);
            }
            else
            {
                printf("\nError in read! e = %d and received = %d bytes\n", e, received);
                return -1;
            }
        }

        libusb_release_interface(handle, 0);
    libusb_free_device_list(usb_dev, 1);

        libusb_close(handle);
        libusb_exit(NULL);

        printf("\n");
        return 0;
    }
Russ Schultz

Es bastante seguro que la mayor parte de la transferencia transferirá todo el búfer a la vez (hasta 64, o 512 si está haciendo bytes de alta velocidad), no un byte a la vez.

Está iterando sobre el tamaño del búfer esperado y haciendo un volumen para cada byte, y solo imprime el primer byte.

Deshazte del bucle for en la lectura y cambia tu printf () a printf ("% s \ n", my_string1);

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Android: no se pueden recibir datos de PHP

No se pueden recibir datos POST en nodeJs

Zendesk API + Angular: no se pueden recibir datos debido a CORS

No se pueden mostrar datos con matplotlib

No se pueden leer datos con Retrofit to Fragment

No se pueden obtener datos xml con jQuery

SQL: no se pueden excluir datos con NOT EXIST

No se pueden seleccionar datos con PDO

No se pueden recuperar datos con elocuente

No se pueden cargar datos incorrectos con Anzograph

No se pueden mostrar datos http con MatTableDataSource

No se pueden extraer datos con Scrapy

No se pueden guardar datos con php

No se pueden recibir datos de la base de datos de firebase

No se pueden recibir datos cuando se combinan la selección y el protocolo UDP

No se pueden recibir datos cuando se combinan la selección y el protocolo UDP

no se pueden recibir datos adicionales de la notificación push de análisis en Android

no se pueden recibir datos adicionales de la notificación push de análisis en Android

No se pueden recibir cadenas de la base de datos de Android Firebase

Error de CORS, no se pueden recibir datos del backend principal de asp.net

No se pueden recibir datos de cadena de Python Socket a Java Socket

No se pueden recuperar datos con una fuente de datos externa

Quickblox: no se pueden recibir notificaciones push con FCM obteniendo errr 401

Websockets de Python, no se pueden recibir mensajes

No se pueden solicitar datos cronológicamente con Cloud Firestore

No se pueden activar o desactivar los datos con appium

No se pueden observar datos nulos: MVVM con Livedata

no se pueden guardar datos en MongoDB con esta asignación

No se pueden importar 'conjuntos de datos' con scikit-learn

TOP Lista

CalienteEtiquetas

Archivo