Linux下MCP2200 HID通信问题:GPIO输入模块C/C++开发异常
问题描述
我需要将一款8路光耦隔离数字输入模块用作输入模块,通过GPIO引脚检测12~24V DC信号,该模块基于MCP2200芯片。开发语言为C/C++,禁止使用hidapi或其他外部库。
设备终端信息
Bus 002 Device 002: ID 04d8:00df Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 bDeviceSubClass 2 bDeviceProtocol 1 bMaxPacketSize0 8 idVendor 0x04d8 idProduct 0x00df bcdDevice 1.01 iManufacturer 1 Microchip Technology Inc. iProduct 2 MCP2200 USB Serial Port Emulator iSerial 3 0010891880 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x006b bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Association: bLength 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 bFunctionClass 2 bFunctionSubClass 2 bFunctionProtocol 1 iFunction 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 bInterfaceSubClass 2 bInterfaceProtocol 1 iInterface 0 CDC Header: bcdCDC 1.10 CDC ACM: bmCapabilities 0x06 sends break line coding and serial state CDC Union: bMasterInterface 0 bSlaveInterface 1 CDC Call Management: bmCapabilities 0x00 bDataInterface 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 2 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 29 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 1 can't get device qualifier: Resource temporarily unavailable can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0000 (Bus Powered)
遇到的问题
我编写了一段测试代码读取设备ID,但返回结果异常。正确的设备ID应为:
- 厂商ID:
0x04d8 - 产品ID:
0x00df
测试代码如下:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <linux/hiddev.h> #include <linux/input.h> #include <dirent.h> #include <unistd.h> int main(void){ int fd=-1; fd= open("/dev/ttyACM0", O_RDWR); if(fd<0){ fprintf(stderr,"Can't open device: %s\n",temppath); return -1; } else { printf("DEVICE opened\n"); } struct hiddev_devinfo dinfo; ioctl(fd, HIDIOCGDEVINFO, &dinfo); close(fd); printf("VendorID 0x%X\n", dinfo.vendor); // 实际返回0x400 printf("ProductID 0x%X\n", dinfo.product); // 实际返回0x0 }
需求
- 解决上述代码读取设备ID异常的问题;
- 实现无外部库依赖的MCP2200 HID通信,完成GPIO输入信号的检测。
内容的提问来源于stack exchange,提问作者Ömer
相关产品推荐
相关产品推荐

