Структура передачи JNA по справочной справке - PullRequest
4 голосов
/ 01 июня 2009

Я пытаюсь использовать JNA для связи через USB-устройство, подключенное к компьютеру. Используя Java и .dll, которые были предоставлены мне. У меня проблемы с функцией записи:

код C:

typedef struct {
    unsigned int id;
    unsigned int timestamp;
    unsigned char flags;
    unsigned char len;
    unsigned char data[16];
} CANMsg;

CAN_STATUS canplus_Write(
        CANHANDLE handle, //long
        CANMsg *msg
    );

Java-эквивалент:

public class CANMsg extends Structure{
    public int id = 0;
    public int timestamp = 0;
    public byte flags = 0;
    public byte len = 8;
    public byte data[] = new byte[16];
}

int canplus_Write(NativeLong handle, CANMsg msg);

Я подтвердил, что могу открыть и закрыть устройство. Закрытие требует дескриптор NativeLong, поэтому я предполагаю, что проблема здесь заключается в сообщении CANMsg. Я также подтвердил, что устройство работает при тестировании только с кодом C.

Я внимательно прочитал документацию JNA ... Я думаю. Любые указатели. Спасибо всем.

Ответы [ 4 ]

1 голос
/ 29 июля 2009

Лен размер структуры? Если да; тогда значение, которое вы дали, неверно. Сделайте это:

CANMsg msg = new CANMsg();
msg.len = msg.size();
1 голос
/ 06 августа 2009

У меня тоже проблема с интерфейсом canplus_write. Пока что все указывает на ошибку в предоставленном драйвере - я не думаю, что новый модуль USBCANPlus прошел надлежащую фазу тестирования. Из вашего кода я вижу, что вы используете более старую версию драйвера, так как поле данных должно состоять из 8 байтов (это максимальное количество байтов данных в сообщении CAN). В ходе моих собственных исследований я обнаружил, что драйвер не может правильно преобразовать данные в символы ASCII, т. Е. Если вы хотите отправить 01 02 03, он вместо этого будет передавать символы ASCII '1' '2' '3' в модуль. из '0' '1' '0' '2' '0' '3' - вы можете использовать программное обеспечение для мониторинга USB, чтобы проверить это. В данный момент я поддерживаю связь со службой технической поддержки FTDI и надеюсь, что они скоро выпустят обновленную версию драйвера.

Надеюсь, это тоже решит вашу проблему, я бы порекомендовал также связаться с ними.

1 голос
/ 01 июня 2009

Я не знаю много о JNA, но передача данных между языками обычно завершается неудачно, когда указатели передаются как простой адрес.

Если это данные, на которые он указывает, которые вы хотите отправить через, вероятно, где-то есть вызов метода упаковки. Если вы не написали это сами, возможно, это сгенерировано этой структурой JNA ... Может быть полезно добавить это к вашему вопросу.

Отображение C char в байт Java также немного странно для меня, но я вижу, откуда это может прийти. В какой операционной системе вы используете этот код?

0 голосов
/ 10 июня 2010

Я ничего не знаю о dll, который вы используете, но CANMsg.len, скорее всего, относится к тому, сколько байтов на самом деле находится в данных byte []. Поэтому вам нужно будет либо отслеживать, сколько вы записываете в массив данных byte [16], либо рассчитывать len на основе завершающего нулевого символа (предполагая, что String ASCII - это данные). Я не думаю, что CANMsg.size () существует или реализован так, как предлагает Расти.

...