Не удается прочитать с устройства 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();
}
}