Бит-бит с USB к последовательному UART

Я только что купил UM232R USB Serial UART Development Module, который использует чип FT232RL для эмуляции UART-подобного интерфейса через USB.
Я на самом деле только что купил этот сложный модуль для очень простой цели: для запуска очень простой светодиодной схемы, которую я построил сам. Так что все, что я хочу, это "бит-взрыв" первого бит-битового вывода "CB0" (вывод 23) [см. Стр. 8/9 в спецификации] модуля. Используя C++ или AHK (или, может быть, Python, хотя я этого не знаю), это не имеет большого значения. И это должно работать на Windows.

Что я пробовал до сих пор:
Я нашел хороший учебник о том, как "побить" устройства FTDI. Но прежде всего я установил драйвер VCP или, если быть более точным, "исполняемый файл установки" в правой части таблицы. Это установило не только драйвер VCP, но также и драйвер D2XX. Затем я скачал драйвер D2XX в виде почтового индекса (тот, что для Windows).

Тогда ладно:

  • Я создал новый проект Visual C++ (консольное приложение Win32 с предварительно скомпилированным заголовком).
  • Я извлек драйвер D2XX в папку проекта.
  • Я добавил заголовочный файл ftd2xx.h в проект.
  • Я взял этот кусок кода из упомянутого учебника и изменил его так:

(Я на самом деле просто добавил 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 ответ

Решение

Поскольку вы получаете неразрешенные ошибки ссылок для функций библиотеки FTDI, вам следует проверить настройки компоновщика для вашего проекта и убедиться, что вы как-то сообщаете компоновщику, где найти библиотеку FTDI. Вероятно, есть файл, предоставленный FTDI, имя которого заканчивается на ".lib", и вам нужно добавить его в список "Дополнительные входы компоновщика".

Кроме того, вы, похоже, не понимаете, используете ли вы драйвер VCP или драйвер D2xx для этого устройства. Вы не можете использовать оба, и вы должны убедиться, что вы используете драйвер D2xx, проверив устройство в диспетчере устройств, иначе вы получите ошибки во время выполнения в будущем.

Также обратите внимание, что учебному пособию уже 5 лет, поэтому вам, возможно, придется обратиться к актуальной документации FTDI, чтобы получить обновленную информацию.

Другие вопросы по тегам