USB到串行UART的位冲击

时间:2014-07-08 15:17:50

标签: c++ visual-c++ serial-port uart ftdi

我刚买了UM232R USB Serial UART Development Module,它使用FT232RL芯片通过USB模拟类似UART的接口。
我实际上只是为了一个非常简单的目的而买了这个复杂的模块:触发一个我自己构建的非常简单的LED电路。所以我想要的只是" bit-bang"第一个可以咬住的引脚" 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控制台应用程序) 预编译头。)。
  • 我在项目文件夹中解压缩了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 ==========

这一切对我来说都非常复杂。我希望有人可以帮助我。我真的很感激!

1 个答案:

答案 0 :(得分:2)

由于您获得了FTDI库函数的未解决的引用错误,您应该检查项目的链接器设置,并确保以某种方式告诉链接器在哪里可以找到FTDI库。 FTDI可能提供了一个文件,其名称以“.lib”结尾,您需要将其添加到“其他链接器输入”列表中。

此外,您似乎对是否使用此设备的VCP驱动程序或D2xx驱动程序感到困惑。您不能同时使用这两种方法,并且应该通过在设备管理器中检查设备来确保使用D2xx驱动程序,否则您将在未来遇到运行时错误。

另外,请注意教程是5年,因此您可能需要参考FTDI的实际文档以获取更新信息。