c - 我的 Windows7 上 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 入门代码:
[来源] https://www.ftdichip.com/Support/SoftwareExamples/LibFT4222-v1.4.4.zip
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;
}
解决方案
来自https://ftdichip.com/wp-content/uploads/2020/08/TN_152_USB_3.0_Compatibility_Issues_Explained.pdf第2.1.2 节位置 ID 返回为 0
严格来说,LocationID 不是 FTDI 提供的格式的 USB 规范的一部分。该功能是作为附加选项添加的,用于通过索引、序列号或产品描述字符串备份识别和打开端口。
当连接到 USB 2.0 端口时,根据设备连接到的 USB 端口提供位置。这些值派生自特定的注册表项。由于第 3 方 USB 3.0 主机驱动程序的注册表树与 Microsoft 通用驱动程序不同,因此无法计算位置 ID。
目前没有解决此问题的方法,因此此类设备应按索引、序列号或产品描述字符串列出和打开。
所以这是已知的行为。顺便说一句,Win 7 EOL 日期是 2020 年 1 月。强烈建议更改操作系统。
推荐阅读
- vba - 循环工作表不起作用 - 有什么想法吗?
- flutter - 添加水印时出现FFmpeg错误:未覆盖 - 退出
- spring-boot - 使用 spring security oauth2 保护 Rest-API(Spring Security + OAuth2 + Spring Boot + STATELESS)
- javascript - 在js中为数组中的每个元素调用fetch函数时的异步问题
- python - 如何使用 updatemenues 优化绘图图?
- flutter - Flutter - 当链接中没有图像时如何捕获 Image.network 错误
- java - 如何使用 ANTRL4 解析 Clickhouse-SQL 语句?
- linux - 如何使用 hping3 进行具有增量数据包大小的 Syn Flood 攻击
- c++ - 内存映射的 C++ 对象非硬件成员
- node.js - 安装特定软件包时的 Node-Gyp (node-rdkafka)