[c++] libusb를 활용한 데이터 송수신

libusb는 USB 장치를 다루기 위한 C 언어 라이브러리로, USB 드라이버를 직접 다룰 수 있게 해줍니다. 이 라이브러리를 사용하여 USB 장치와 데이터를 송수신하는 방법을 알아보겠습니다.

libusb 설치

libusb를 사용하기 위해서는 먼저 해당 라이브러리를 시스템에 설치해야 합니다. 보통의 경우, libusb 패키지를 시스템 패키지 관리자를 통해 설치할 수 있습니다.

libusb로 USB 장치 찾기

USB 장치를 다루기 위해서는 먼저 해당 장치를 찾아야 합니다. libusb를 사용하여 USB 장치를 찾는 방법은 다음과 같습니다.

#include <libusb-1.0/libusb.h>

int main() {
    libusb_device **devs;
    libusb_context *ctx = NULL;
    ssize_t cnt;

    // libusb 초기화
    int r = libusb_init(&ctx);
    if(r < 0) {
        return r;
    }

    // 장치 리스트 가져오기
    cnt = libusb_get_device_list(ctx, &devs);
    if(cnt < 0) {
        return (int) cnt;
    }

    //...

    // libusb 정리
    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);
    return 0;
}

위 코드는 libusb를 사용하여 USB 장치를 찾는 간단한 예제입니다.

데이터 송수신

USB 장치를 찾았다면, 이제 해당 장치로부터 데이터를 읽거나 데이터를 보낼 수 있습니다. libusb를 사용하여 데이터를 송수신하는 방법은 다음과 같습니다.

int main() {
    //...

    // USB 통신 설정
    libusb_device_handle *dev_handle;
    dev_handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID);
    if(dev_handle == NULL) {
        return -1;
    }

    // 데이터 전송
    unsigned char data[64];
    int transferred;
    int r = libusb_bulk_transfer(dev_handle, ENDPOINT_OUT, data, sizeof(data), &transferred, TIMEOUT);
    if(r == 0 && transferred == sizeof(data)) {
        // 전송 성공
    } else {
        // 전송 실패
    }

    // 데이터 수신
    r = libusb_bulk_transfer(dev_handle, ENDPOINT_IN, data, sizeof(data), &transferred, TIMEOUT);
    if(r == 0) {
        // 수신 성공
    } else {
        // 수신 실패
    }

    libusb_close(dev_handle);
    
    //...

    return 0;
}

위 코드는 libusb를 사용하여 USB 장치로부터 데이터를 송수신하는 간단한 예제입니다.

libusb를 사용하면 USB 장치와 데이터를 손쉽게 다룰 수 있으며, 커널 드라이버의 수정 없이도 USB 통신을 수행할 수 있습니다.

자세한 내용은 libusb 공식 사이트에서 확인할 수 있습니다.