2012-12-17 5 views
1

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 바이트입니다.

답변

1

내게 수치스러워, 바보 같은 실수. 코드는 다음과 같아야합니다.

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

이어야합니다. 더 잘 것이고 적은 것을 써야합니다!