1

https://github.com/signal11/hidapi/issues/72によると、HIDAPIはLinuxマシンでスレッドセーフである必要があります。しかし、私はそれをまったく動作させることができません。これが私がすることです:

#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <assert.h>

#include "hidapi.h"
hid_device *handle;

static void *TaskCode(void *argument)
{
    int res;
    //hid_device *handle;
    unsigned char buf[64];

//     res = hid_init();
//     if( res == -1 )
//     {
//         return (void*)1;
//     }
//
//     handle = hid_open(0x0911, 0x251c, NULL);
//     if( handle == NULL )
//     {
//         return (void*)2;
//     }

    printf( "while 2\n");

    while( 1 )
    {
        memset( buf, 64, 0 );
        res = hid_read(handle, buf, 0);
        if( res == -1 )
        {
            return (void*)3;
        }

        printf( "received %d bytes\n", res);

        for (int i = 0; i < res; i++)
            printf("Byte %d: %02x ", i+1, buf[i]);
        //printf( "%02x ", buf[0]);
        fflush(stdout);
    }

    return (void*)0;
}


int main(int argc, char* argv[])
{
    int res;
    //hid_device *handle;
    unsigned char buf[65];

    res = hid_init();
    if( res == -1 )
    {
        return 1;
    }

    handle = hid_open(0x0911, 0x251c, NULL);
    if( handle == NULL )
    {
        return 2;
    }

    hid_set_nonblocking( handle, 0 );

    pthread_t thread;
    int rc = pthread_create(&thread, NULL, TaskCode, NULL);

    printf( "while 1\n");

    while(1)
    {
        int a = getchar();
        if( a == 'a')
        {
            // Get Device Type (cmd 0x82). The first byte is the report number (0x0).
            buf[0] = 0x0;
            buf[1] = 0x82;
            res = hid_write(handle, buf, 65);
            if( res != -1 )
                printf( "write ok, transferred %d bytes\n", res );
            else
            {
                printf( "write error\n" );
                char* str = hid_error(handle);
                printf( "error: %s\n", str );
                return 1;
            }
        }
        else if( a== 'b')
            break;
    }

    void* trc;
    rc = pthread_join(thread, &trc);

    printf( "rc code: %d\n", (int)trc );

    // Finalize the hidapi library
    res = hid_exit();

    return 0;
}

グローバルハンドルを使用しないと、毎回「書き込みエラー」が発生します。例のように、正式にはすべてが機能しますが、hid_readは常に0バイトを返します...もちろん、単純なhid_write()の後にhid_read()を実行すると、意図したとおりにコマンド0x82に対して正しい応答が返されます。 。私はここで本当に迷っています、私は何かを見落としていますか?

編集:明確にするために、ゼロバイトはすべてを含むすべてに対しても返されます。マウスのボタンなど。それで動作するように見えますが、データバッファは常にゼロバイトです。

4

1 に答える 1

1

恥ずかしい、ばかげた間違い。コードは次のようになります。

memset( buf, 0, 64 );
res = hid_read(handle, buf, 64);

そしてそれは動作します。もっと寝て、書く量を減らすべきです!

于 2012-12-18T11:41:05.543 に答える