usb_hid编程

通过上位机软件给英飞凌芯片发送信号,模拟喷油,节气门开度等信息,但是在重复发送命令和reset过程中,会出现读取不到数据的情况,调查了好久也没有找到原因,与下位机通信的接口都是调用的微软封装的SetupDi系列函数,但是总是读不上来数据,问题原因有待调查,今天找到了HID API的纯C封装版本,而且跨平台,看了下介绍,很强大,记录下来。先贴例子程序

  1 /*******************************************************
  2  Windows HID simplification
  3 
  4  Alan Ott
  5  Signal 11 Software
  6 
  7  8/22/2009
  8 
  9  Copyright 2009, All Rights Reserved.
 10  
 11  This contents of this file may be used by anyone
 12  for any reason without any conditions and may be
 13  used as a starting point for your own applications
 14  which use HIDAPI.
 15 ********************************************************/
 16 
 17 #include <stdio.h>
 18 #include <wchar.h>
 19 #include <string.h>
 20 #include <stdlib.h>
 21 #include "hidapi.h"
 22 
 23 // Headers needed for sleeping.
 24 #ifdef _WIN32
 25     #include <windows.h>
 26 #else
 27     #include <unistd.h>
 28 #endif
 29 
 30 int main(int argc, char* argv[])
 31 {
 32     int res;
 33     unsigned char buf[256];
 34     #define MAX_STR 255
 35     wchar_t wstr[MAX_STR];
 36     hid_device *handle;
 37     int i;
 38 
 39 #ifdef WIN32
 40     UNREFERENCED_PARAMETER(argc);
 41     UNREFERENCED_PARAMETER(argv);
 42 #endif
 43 
 44     struct hid_device_info *devs, *cur_dev;
 45     
 46     if (hid_init())
 47         return -1;
 48 
 49     devs = hid_enumerate(0x0, 0x0);
 50     cur_dev = devs;    
 51     while (cur_dev) {
 52         printf("Device Found
  type: %04hx %04hx
  path: %s
  serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
 53         printf("
");
 54         printf("  Manufacturer: %ls
", cur_dev->manufacturer_string);
 55         printf("  Product:      %ls
", cur_dev->product_string);
 56         printf("  Release:      %hx
", cur_dev->release_number);
 57         printf("  Interface:    %d
",  cur_dev->interface_number);
 58         printf("
");
 59         cur_dev = cur_dev->next;
 60     }
 61     hid_free_enumeration(devs);
 62 
 63     // Set up the command buffer.
 64     memset(buf,0x00,sizeof(buf));
 65     buf[0] = 0x01;
 66     buf[1] = 0x81;
 67     
 68 
 69     // Open the device using the VID, PID,
 70     // and optionally the Serial number.
 71     ////handle = hid_open(0x4d8, 0x3f, L"12345");
 72     handle = hid_open(0x4d8, 0x3f, NULL);
 73     if (!handle) {
 74         printf("unable to open device
");
 75          return 1;
 76     }
 77 
 78     // Read the Manufacturer String
 79     wstr[0] = 0x0000;
 80     res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
 81     if (res < 0)
 82         printf("Unable to read manufacturer string
");
 83     printf("Manufacturer String: %ls
", wstr);
 84 
 85     // Read the Product String
 86     wstr[0] = 0x0000;
 87     res = hid_get_product_string(handle, wstr, MAX_STR);
 88     if (res < 0)
 89         printf("Unable to read product string
");
 90     printf("Product String: %ls
", wstr);
 91 
 92     // Read the Serial Number String
 93     wstr[0] = 0x0000;
 94     res = hid_get_serial_number_string(handle, wstr, MAX_STR);
 95     if (res < 0)
 96         printf("Unable to read serial number string
");
 97     printf("Serial Number String: (%d) %ls", wstr[0], wstr);
 98     printf("
");
 99 
100     // Read Indexed String 1
101     wstr[0] = 0x0000;
102     res = hid_get_indexed_string(handle, 1, wstr, MAX_STR);
103     if (res < 0)
104         printf("Unable to read indexed string 1
");
105     printf("Indexed String 1: %ls
", wstr);
106 
107     // Set the hid_read() function to be non-blocking.
108     hid_set_nonblocking(handle, 1);
109     
110     // Try to read from the device. There shoud be no
111     // data here, but execution should not block.
112     res = hid_read(handle, buf, 17);
113 
114     // Send a Feature Report to the device
115     buf[0] = 0x2;
116     buf[1] = 0xa0;
117     buf[2] = 0x0a;
118     buf[3] = 0x00;
119     buf[4] = 0x00;
120     res = hid_send_feature_report(handle, buf, 17);
121     if (res < 0) {
122         printf("Unable to send a feature report.
");
123     }
124 
125     memset(buf,0,sizeof(buf));
126 
127     // Read a Feature Report from the device
128     buf[0] = 0x2;
129     res = hid_get_feature_report(handle, buf, sizeof(buf));
130     if (res < 0) {
131         printf("Unable to get a feature report.
");
132         printf("%ls", hid_error(handle));
133     }
134     else {
135         // Print out the returned buffer.
136         printf("Feature Report
   ");
137         for (i = 0; i < res; i++)
138             printf("%02hhx ", buf[i]);
139         printf("
");
140     }
141 
142     memset(buf,0,sizeof(buf));
143 
144     // Toggle LED (cmd 0x80). The first byte is the report number (0x1).
145     buf[0] = 0x1;
146     buf[1] = 0x80;
147     res = hid_write(handle, buf, 17);
148     if (res < 0) {
149         printf("Unable to write()
");
150         printf("Error: %ls
", hid_error(handle));
151     }
152     
153 
154     // Request state (cmd 0x81). The first byte is the report number (0x1).
155     buf[0] = 0x1;
156     buf[1] = 0x81;
157     hid_write(handle, buf, 17);
158     if (res < 0)
159         printf("Unable to write() (2)
");
160 
161     // Read requested state. hid_read() has been set to be
162     // non-blocking by the call to hid_set_nonblocking() above.
163     // This loop demonstrates the non-blocking nature of hid_read().
164     res = 0;
165     while (res == 0) {
166         res = hid_read(handle, buf, sizeof(buf));
167         if (res == 0)
168             printf("waiting...
");
169         if (res < 0)
170             printf("Unable to read()
");
171         #ifdef WIN32
172         Sleep(500);
173         #else
174         usleep(500*1000);
175         #endif
176     }
177 
178     printf("Data read:
   ");
179     // Print out the returned buffer.
180     for (i = 0; i < res; i++)
181         printf("%02hhx ", buf[i]);
182     printf("
");
183 
184     hid_close(handle);
185 
186     /* Free static HIDAPI objects. */
187     hid_exit();
188 
189 #ifdef WIN32
190     system("pause");
191 #endif
192 
193     return 0;
194 }

网站地址: http://www.signal11.us/oss/hidapi/

为了方便读者的使用,我已经编译出了一个版本,可以直接下载,压缩包里有dll和lib两个版本。

http://pan.baidu.com/s/1DuNEP

原文地址:https://www.cnblogs.com/lniwn/p/3411528.html