【问题标题】:QT project and USB connectionQT项目和USB连接
【发布时间】:2021-03-13 14:40:39
【问题描述】:

我的 FTD2xx 驱动程序有问题。 我在 Fedora 26(64 位)和“2232H”设备的 FTD2xx 的最新版本中使用 QT(C++)。 构建方法也是:

qmake /Address/ProjectName.pro -r -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug

问题:

FT_Status 在 ft_openex(....) 命令中返回 0(FT_OK),但对于 FTD2xx lib 的其他函数返回 none_zero(FT_OK); 我的一段代码:

FT_HANDLE   ftH;
FT_STATUS   ftStatus;
ftStatus = FT_OpenEx(const_cast<char*>("MYDevName"), FT_OPEN_BY_SERIAL_NUMBER, &ftH);
std::cout<<"FTST open:"<< ftStatus<<std::endl;
char a[10];DWORD b;
ftStatus = FT_SetBitMode(&ftH,0xff,0);
std::cout<<"FTST RESET:"<< ftStatus<<std::endl;
ftStatus = FT_SetBitMode(&ftH,0xff,0x40);
std::cout<<"FTST SPEED:"<< ftStatus<<std::endl;
ftStatus = FT_Close(&ftH);
std::cout<<"FTST CLOSE:"<< ftStatus<<std::endl;

And output :
FTST open:0
FTST RESET:1
FTST SPEED:1
FTST CLOSE:1
ftStatus =1 ;means FT_INVALID_HANDLE.
and
Command <<rmmod ftdi_sio >> is using.
and
Lib directory: /dev/local/lib
and
QT setting:
LIBS += -L$$PWD/../../../usr/local/lib/ -lftd2xx
INCLUDEPATH += $$PWD/../../../usr/local/include
DEPENDPATH += $$PWD/../../../usr/local/include

【问题讨论】:

  • 请修正您的格式。另外我认为这与Qt没有任何关系。即使您的项目使用qmake 和 Qt,您也不会遇到链接或运行时问题,因此您所描述的错误来自您在使用 FTD2xx 的 API 时使用的逻辑和/或来自API/板本身。
  • 我在同一硬件中使用不同驱动程序 (libftdi) 的相同代码。但由于 chunk_size 和 ... 的一些问题,我正在测试第二个驱动程序(libftd2xx)。

标签: c++ linux qt


【解决方案1】:

FT_HANDLEFT_OpenEx 中的输出参数。您正确传递了&amp;ftH,以便函数可以覆盖ftH

FT_HANDLE 是其他函数的输入参数。您错误地传递了&amp;ftH,应该只传递ftH

FT_Close(&amp;ftH); FT_Close(ftH);

不幸的是,FT_HANDLE 的定义是松散类型的:

typedef void* PVOID;
typedef PVOID FT_HANDLE;

由于void** 隐式转换为void*,编译器无法帮助您发现此错误1。一般来说,不透明的句柄类型应该声明为

typedef struct AlwaysIncompleteType * MY_HANDLE;

然后指针和双指针类型将适当地不兼容。


1 更糟糕的是,在 C 中,从 void*void** 的反向转换是也是隐式的,您可以调用 FT_OpenEx(..., ftH) 可能会导致立即访问冲突(又名分段错误)并可能导致不可预知的内存损坏。至少 C++ 做对了……但void* 仍然不利于强类型检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多