Не удается прочитать с устройства FTDI (очередь приема всегда пуста)

Я пытаюсь прочитать данные с нестандартного лабораторного устройства с чипом FTDI (конвертер USB-to-serial).

У меня нет спецификаций / документации для устройства. Тем не менее, устройство поставляется с приложением Windows. Используя API Monitor, я обнаружил, что приложение общается с устройством через d2xx.dll и определил большинство необходимых параметров (скорость передачи, настройки управления потоком (FT_FLOW_NONE) и характеристики данных).

Используя jd2xx, я написал простой тестовый код на Java. Код успешно находит и открывает устройство, устанавливает все параметры и даже записывает данные (я могу передать целое число и увидеть его на экране устройства). Однако очередь приема, кажется, всегда пуста (возвращает ноль байтов).

Я переписал код на C (если jd2xx вызвал проблему) и снова не получил никаких данных. Все функции возвращают FT_Status_OK, но в очереди приема нет данных. В Java я также пытался установить связь с устройством, как если бы это был настоящий USB-порт (используя usb4java) или последовательный порт (используя jSCC). По-прежнему нет данных. Само устройство работает безупречно с вышеупомянутым приложением Windows, поэтому проблема в моем коде.

Работающее приложение использует следующую последовательность функций:
FT_ListDevices, FT_OpenEx, FT_SetBaudRate, FT_SetDataCharacteristics, FT_SetFlowControl (FT_FLOW_NONE), FT_Purge (FT_PURGE_RX), FT_Prite (я понятия не имею, что они пишут), FT_Purge (FT_et_Tue_GT)

Возможно ли, что функции FT_Write каким-то образом настраивают устройство для выдачи данных? (Я новичок как в чипах FTDI, так и в программировании, поэтому эта ситуация меня очень смущает) Нужно ли каким-то образом запускать чип FTDI для передачи данных в очередь приема? Что еще я могу попробовать?

Мой код (версия Java) выглядит следующим образом:

import jd2xx.*;
import java.io.IOException;

public class ReadData {

    public static void main(String[] args) throws IOException, InterruptedException {
        JD2XX jd = new JD2XX();
        int byteNumber = 0;

        jd.openByDescription("USB <-> Serial");

        jd.setBaudRate(9600);
        jd.setDataCharacteristics(8, JD2XX.STOP_BITS_1, JD2XX.PARITY_NONE);
        jd.setFlowControl(JD2XX.FLOW_NONE, 0, 0);

        jd.purge(JD2XX.PURGE_RX);

        long t = System.currentTimeMillis();
        long end = t + 15000;

        while (System.currentTimeMillis() < end) {
            byteNumber = jd.getQueueStatus();
            if (byteNumber != 0) {
                byte[] rd = jd.read(byteNumber);
                System.out.println(new String(rd));
            } else {
                System.out.print(".");
                Thread.sleep(1000);
           }
       }

        jd.purge(JD2XX.PURGE_RX);
        jd.close();
    }
}

0 ответов

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