我的FTD2xx驱动程序有问题。我在Fedora 26(64位(中使用QT(C++(;2232H";装置此外,构建方法是:
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
FT_HANDLE
是FT_OpenEx
中的一个输出参数。您正在正确传递&ftH
,以便函数可以覆盖ftH
。
FT_HANDLE
是其它功能的输入参数。您错误地通过了&ftH
,应该只通过ftH
。
FT_Close(&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++做对了。。。但是CCD_ 16仍然不利于强类型检查。