Отправлять и получать данные через USB-порт между ПК и Arduino - PullRequest
0 голосов
/ 01 марта 2019

Я хочу отправить некоторые данные со своего ноутбука на Arduino с использованием библиотеки libusb в синхронном режиме, затем я получу те же данные с некоторыми изменениями, это соответствующая часть моего кода c:

int main()
{
    int res                      = 0;  /* return codes from libusb functions */
    libusb_device_handle* handle = 0;  /* handle for USB device */
    int kernelDriverDetached     = 0;  /* Set to 1 if kernel driver detached */
    int numBytes                 = 0;  /* Actual bytes transferred. */
    libusb_context *ctx          = NULL; //a libusb session
    uint8_t buffer[]="hello world!!!!";  //data to send
    uint8_t buffer1[64]="";
    printf("%s\n", buffer);
    /* Initialise libusb. */
    printf("emission...\n");
    res = libusb_init(&ctx);

    if (res != 0)
    {
        fprintf(stderr, "Error initialising libusb.\n");
        return 1;
    }
    handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID);
    if (!handle)
    {
        fprintf(stderr, "Unable to open device.\n");
        return 1;
    }
    /* Check whether a kernel driver is attached to interface #0. If so, we'll
    * need to detach it.
    */

    if (libusb_kernel_driver_active(handle, 0))
    {
        res = libusb_detach_kernel_driver(handle, 0);
        if (res == 0)
        {
            kernelDriverDetached = 1;
        }
        else
        {
            fprintf(stderr, "Error detaching kernel driver.\n");
            return 1;
        }
    }

    /* Claim interface #0. */
    res = libusb_claim_interface(handle, 0);
    if (res != 0)
    {
        fprintf(stderr, "Error claiming interface.\n");
        return 1;
    }
    /* Send the message to endpoint 1 with a 100ms timeout. */

    res = libusb_bulk_transfer(handle, ENDPOINT_OUT, buffer, (int)strlen((char*)buffer), &numBytes, 100);
    if (res == 0)
    {
        printf("%d bytes transmitted successfully.\n", numBytes);
    }
    else
    {
        fprintf(stderr, "Error sending message to device.\n");
    }

    res = libusb_bulk_transfer(handle, ENDPOINT_IN, buffer1, 64, &numBytes, 0);
    if (0 == res)
    {
        printf("received data: %s \n", buffer1);
        printf("length: %d %d\n", (int)strlen((char*)buffer1),numBytes);
    }
    else printf("reception error!\n");

    /* Release interface #0. */
    res = libusb_release_interface(handle, 0);
    if (0 != res)
    {
        fprintf(stderr, "Error releasing interface.\n");
    }

    /* If we detached a kernel driver from interface #0 earlier, we'll now
    * need to attach it again.  */
    if (kernelDriverDetached)
    {
        libusb_attach_kernel_driver(handle, 0);
    }

    /* Shutdown libusb. */
    libusb_exit(ctx);

    return 0;
}

и это соответствующая часть кода Arduino:

char code[64]="";   
byte i;         
byte j;

void loop()
{
    i = 0;
    j = 0;
    while(Serial.available() && i<64)  // we have some data to receive
    {
        j = 1;
        code[i] = Serial.read();  
        delay(50);
        i++;
    }
    if (i<64){
        code[i]='\0';
    }
    else {
        code [63]='\0';
    }
    if (j==1){
        Serial.write("received by Arduino: ");
        Serial.println(code);
        j=0;
    }

    while(!Serial.available());   
}

во время работы, данные не получены должным образом, пример выполнения:

Привет, мир!!!!испускание ... 15 байт успешно передано.

полученные данные: нет: rl

полученные Arduino: d

длина: 32 32

обычно я должен получить "полученный Arduino: здравствуй мир !!!!"

...