根据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的正确答复。我真的迷路了,我是不是忽略了什么?
编辑:为了澄清,零字节也返回一切,包括。鼠标上的按钮等等,所以它似乎工作,但数据缓冲区总是零字节。
发布于 2012-12-18 11:41:05
以我为耻,一个愚蠢的错误。守则应是:
memset( buf, 0, 64 );
res = hid_read(handle, buf, 64);然后它就起作用了。应该多睡,少写!
https://stackoverflow.com/questions/13914966
复制相似问题