C Windows 7上FT4222的USB位置地址错误
我有一台带有3个USB端口的windows 7笔记本电脑(Sony pcg 81113M),当我连接2*Ft 4222HQ并运行“Ft4222的入门代码”(C++Qtcreator)时,我得到了一个错误的USB位置,即0x00。当我只连接该特定2个端口中的一个端口时也是如此 我正在使用软件USBview验证已连接FTDI的USB位置 我在程序中使用“按位置连接”,如果我同时连接两个,它将作为一个设备使用(因为位置Id相同) FTDI驱动程序是最新版本,我在设备管理器中看到了所有接口 注意:第三个USB端口工作正常,我获得了正确的位置Id: 操作系统是win7 64位,FTDI代码在32位上运行(我也得到了64位的相同结果) 有人对此有想法吗?是否有其他测试,我可以做它来找出问题 以下是FTDI入门代码: [来源] 从第2.1.2节开始,位置ID返回为0 LocationID严格来说不是该格式的USB规范的一部分 由FTDI提供。该功能已作为附加选项添加到 通过索引、序列号或 产品描述字符串 当连接到USB 2.0端口时,将根据 设备连接到的USB端口的名称。这些值是 从特定注册表项派生。作为第三个的注册表树 第三方USB 3.0主机驱动程序与Microsoft通用驱动程序不同 驱动程序无法计算位置ID 目前没有解决此问题的方法,因此设备 应按索引、序列号或产品列出并打开 描述字符串 这就是众所周知的行为。顺便说一句,Win 7下线日期为2020年1月。强烈建议更改操作系统C Windows 7上FT4222的USB位置地址错误,c,windows-7,usb,ftdi,C,Windows 7,Usb,Ftdi,我有一台带有3个USB端口的windows 7笔记本电脑(Sony pcg 81113M),当我连接2*Ft 4222HQ并运行“Ft4222的入门代码”(C++Qtcreator)时,我得到了一个错误的USB位置,即0x00。当我只连接该特定2个端口中的一个端口时也是如此 我正在使用软件USBview验证已连接FTDI的USB位置 我在程序中使用“按位置连接”,如果我同时连接两个,它将作为一个设备使用(因为位置Id相同) FTDI驱动程序是最新版本,我在设备管理器中看到了所有接口 注意:
void ListFtUsbDevices()
{
FT_STATUS ftStatus = 0;
DWORD numOfDevices = 0;
ftStatus = FT_CreateDeviceInfoList(&numOfDevices);
for(DWORD iDev=0; iDev<numOfDevices; ++iDev)
{
FT_DEVICE_LIST_INFO_NODE devInfo;
memset(&devInfo, 0, sizeof(devInfo));
ftStatus = FT_GetDeviceInfoDetail(iDev, &devInfo.Flags, &devInfo.Type, &devInfo.ID, &devInfo.LocId,
devInfo.SerialNumber,
devInfo.Description,
&devInfo.ftHandle);
if (FT_OK == ftStatus)
{
printf("Dev %d:\n", iDev);
printf(" Flags= 0x%x, (%s)\n", devInfo.Flags, DeviceFlagToString(devInfo.Flags).c_str());
printf(" Type= 0x%x\n", devInfo.Type);
printf(" ID= 0x%x\n", devInfo.ID);
printf(" LocId= 0x%x\n", devInfo.LocId);
printf(" SerialNumber= %s\n", devInfo.SerialNumber);
printf(" Description= %s\n", devInfo.Description);
printf(" ftHandle= 0x%x\n", devInfo.ftHandle);
const std::string desc = devInfo.Description;
if(desc == "FT4222" || desc == "FT4222 A")
{
g_FT4222DevList.push_back(devInfo);
}
}
}
}
int main(int argc, char const *argv[])
{
ListFtUsbDevices();
if(g_FT4222DevList.empty()) {
printf("No FT4222 device is found!\n");
return 0;
}
ftStatus = FT_OpenEx((PVOID)g_FT4222DevList[0].LocId, FT_OPEN_BY_LOCATION, &ftHandle);
if (FT_OK != ftStatus)
{
printf("Open a FT4222 device failed!\n");
return 0;
}
printf("\n\n");
printf("Init FT4222 as SPI master\n");
ftStatus = FT4222_SPIMaster_Init(ftHandle, SPI_IO_SINGLE, CLK_DIV_4, CLK_IDLE_LOW, CLK_LEADING, 0x01);
if (FT_OK != ftStatus)
{
printf("Init FT4222 as SPI master device failed!\n");
return 0;
}
printf("TODO ...\n");
printf("\n");
printf("UnInitialize FT4222\n");
FT4222_UnInitialize(ftHandle);
printf("Close FT device\n");
FT_Close(ftHandle);
return 0;
}