工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

windowsでlibusbを使う

概要

Windows PC上で、libusbを使ったC言語プログラムをビルドして、動かした。


背景と目的

Windows PC上で、libusbを使いたいので、方法をメモる。


詳細

参考

0. 環境


1. MinGWをダウンロード、インストール

https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download


2. libusbをダウンロード、インストール

2.1 ダウンロード

https://github.com/libusb/libusb

バイナリを落とす。githubソースコードではない。

2.2 インストール

VS2019のdllを使うので、VS2019/MS64/dll/libusb-1.0.dllを以下のフォルダにコピーする。 これで、出来上がった実行ファイルがlibusb-1.0.dllを参照できる。

C:\Windows\System32


3. コンパイルしてみる

3.1 ソースコード

https://sites.google.com/site/memomuteki/tinylinux/linuxdepentabumojuruwozuochengshiyou

上記を参考に、使うものに合わせて編集。 PC側からの送信に使うエンドポイントアドレスがあるデバイスなので、そのアドレスでlibusb_interrupt_transfer関数を使って送信。

#define VID 0x**** // 使用するものに合わせる
#define PID 0x**** // 使用するものに合わせる
#define INTF_NUM 0
#define EP_ADDR 0x81
#define EP_ADDR2 0x01 // PC側からの送信に使うエンドポイントアドレス
#define MAX_PACKET_SIZE 64 // 変更

:

        // libusb_set_auto_detach_kernel_driver() failed: LIBUSB_ERROR_NOT_SUPPORTEDと出るのでコメントアウト
    // r = libusb_set_auto_detach_kernel_driver(handle, TRUE);
    // if (r != LIBUSB_SUCCESS) {
    //  printf("libusb_set_auto_detach_kernel_driver() failed: %s\n", libusb_error_name(r));
    //  goto exit;
    // }

:

    // 送信用にコードを追加
    int transferred2 = 1;
    buffer2[0] = 0x52;
    libusb_interrupt_transfer(handle, EP_ADDR2, buffer2, sizeof(buffer2), &transferred2, 100);

3.2 コンパイル

include/libusb-1.0のlibusb.hとVS2019フォルダのdllを参照する。

gcc -I./include/libusb-1.0 -L./VS2019/MS64/dll -lusb-1.0 -o test test.c


4. 動かす

実行した結果、正しく通信できた。

52 02 00 4a 02 53 39 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


まとめと今後の課題

Windows PC上で、libusbを使ったC言語プログラムをビルドして、動かすことができた。