https://github.com/signal11/hidapi/issues/72에 따르면 HIDAPI는 Linux 컴퓨터에서 스레드 안전해야합니다. 그러나, 나는 그것을 전혀 작동시키지 못합니다. 이것은 내가하는 일입니다.두 스레드의 HIDAPI
#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_read() 뒤에 간단한 hid_write()를 수행하면 의도 한대로 0x82 명령에 대한 올바른 응답을 얻습니다. . 나는 정말로 여기에서 길을 잃는다, 나는 무엇인가 간과하고있다?
EDIT : 명확히하기 위해 모든 바이트를 포함하여 0 바이트가 반환됩니다. 마우스 등등의 버튼입니다. 따라서 은 작동하려면으로 보이지만 데이터 버퍼는 항상 0 바이트입니다.