我刚买了UM232R USB Serial UART Development Module,它使用FT232RL芯片来模拟USB上的类似UART的接口(interface)。
我实际上只是出于一个非常简单的目的而购买了这个复杂的模块:触发我自己构建的一个非常简单的LED电路。因此,我想要做的就是对模块的第一个可按位插拔的引脚“CB0”(插针23)[see page 8/9 in the datasheet]进行“按位”。使用C++或AHK(或者也许是Python,即使我不太了解)也没关系。它需要在Windows上运行。

我到目前为止已经尝试过:
I found a nice tutorial on how to bit-bang FTDI devices.
但首先,我在表的最右边安装了VCP driver或更准确地说是“安装可执行文件”。这不仅安装了VCP驱动程序,还安装了D2XX驱动程序。然后,我将D2XX driver下载为zip文件(适用于Windows)。

好吧:

  • 我创建了一个新的Visual C++项目(Win32 Console Application with
    预编译的 header )。
  • 我在项目文件夹中提取了D2XX驱动程序。
  • 我将ftd2xx.h头文件添加到了项目中。
  • 我从上述教程中获取了this piece of code并将其修改为:

  • (我实际上只是添加了windows.h,stdafx.h并修改为#include <ftd2xx.h> #include "ftd2xx.h")
    /* 8-bit PWM on 4 LEDs using FTDI cable or breakout.
       This example uses the D2XX API.
       Minimal error checking; written for brevity, not durability. */
    
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include "ftd2xx.h"
    
    #define LED1 0x08  /* CTS (brown wire on FTDI cable) */
    #define LED2 0x01  /* TX  (orange) */
    #define LED3 0x02  /* RX  (yellow) */
    #define LED4 0x14  /* RTS (green on FTDI) + DTR (on SparkFun breakout) */
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i,n;
        unsigned char data[255 * 256];
        FT_HANDLE handle;
        DWORD bytes;
    
        /* Generate data for a single PWM 'throb' cycle */
        memset(data, 0, sizeof(data));
        for(i=1; i<128; i++) {
            /* Apply gamma correction to PWM brightness */
            n = (int)(pow((double)i / 127.0, 2.5) * 255.0);
            memset(&data[i * 255], LED1, n);         /* Ramp up */
            memset(&data[(256 - i) * 255], LED1, n); /* Ramp down */
        }
    
        /* Copy data from first LED to others, offset as appropriate */
        n = sizeof(data) / 4;
        for(i=0; i<sizeof(data); i++)
        {
            if(data[i] & LED1) {
                data[(i + n    ) % sizeof(data)] |= LED2;
                data[(i + n * 2) % sizeof(data)] |= LED3;
                data[(i + n * 3) % sizeof(data)] |= LED4;
            }
        }
    
        /* Initialize, open device, set bitbang mode w/5 outputs */
        if(FT_Open(0, &handle) != FT_OK) {
            puts("Can't open device");
            return 1;
        }
        FT_SetBitMode(handle, LED1 | LED2 | LED3 | LED4, 1);
        FT_SetBaudRate(handle, 9600);  /* Actually 9600 * 16 */
    
        /* Endless loop: dump precomputed PWM data to the device */
        for(;;) FT_Write(handle, &data, (DWORD)sizeof(data), &bytes);
    
        return 0;
    }
    

    (如果我没记错的话,此示例程序应触发设备上的每个(或大多数)位敲击式引脚。)
    但是,当我尝试构建它时,出现了一些奇怪的链接器错误:
    1>------ Build started: Project: FTDI-Project, Configuration: Debug Win32 ------
    1>  FTDI-Project.cpp
    1>FTDI-Project.obj : error LNK2019: unresolved external symbol __imp__FT_Write@16 referenced in function _wmain
    1>FTDI-Project.obj : error LNK2019: unresolved external symbol __imp__FT_SetBaudRate@8 referenced in function _wmain
    1>FTDI-Project.obj : error LNK2019: unresolved external symbol __imp__FT_SetBitMode@12 referenced in function _wmain
    1>FTDI-Project.obj : error LNK2019: unresolved external symbol __imp__FT_Open@8 referenced in function _wmain
    1>C:\Users\username\Documents\Visual Studio 2010\Projects\FTDI-Project\Debug\FTDI-Project.exe : fatal error LNK1120: 4 unresolved externals
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    在我看来,这一切都变得异常复杂。我希望你们中有人可以帮助我。我真的很感激!

    最佳答案

    由于您收到针对FTDI库函数的 Unresolved reference 错误,因此应检查项目的链接器设置,并确保以某种方式告诉链接器在哪里可以找到FTDI库。 FTDI提供的文件可能以“.lib”结尾,您需要将其添加到“其他链接器输入”列表中。

    另外,对于该设备是使用VCP驱动程序还是D2xx驱动程序,您似乎也感到困惑。您不能同时使用两者,并且应通过在设备管理器中检查设备来确保正在使用D2xx驱动程序,否则您将在运行时遇到错误。

    另外,请注意,该教程已有5年历史,因此您可能必须引用FTDI的实际文档以获取更新的信息。

    08-16 11:33