Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Да, насчет размеров 8 и 4 - так. Думаю лучше всего использовать тип Pointer вместо t_x502_hnd
Понял, если бы была С тут бы вопрос скорее всего не возник.
В случае с JNA (Java) скорее всего придется два интерфейса поддерживать для 32 бит и 64 бит.
Спасибо за детали.
Добрый день,
ответы по тексту:
Алексей: Честно говоря не до конца понятно как описанное может быть связано именно с обновлением прошивки. Возможно были какие-то еще изменения в системе?
Сергей: обновлял операционку с Ubuntu 12.04 до Ubuntu 14.04 и обновлял прошивку
Алексей: работало до этого у Вас на той же машине?
Сергей: да на этой же.
Алексей: Функция X502_SetAdcFreq библиотеки возвращает -7 только если передать нулевой указатель в качестве facq (кстати не до конца понятно зачем массив на 20000 точек).
Сергей: double[] facq = new double[]{20000}; - это массив из одного элемента со значением 20000 (мануалка по мэппингу типов JNA (JAVA <-> C ) https://github.com/java-native-access/j … appings.md )
Алексей: Код -155 соответствует ошибке открытия TCP-соединения.
Больше похоже, что проблема в не совсем правильной передаче параметров. Например смущает, что тот же handle у Вас идет как long, хотя в библиотеке это указатель и их размеры одинаковы только на 32-битной системе, а в 64-битной будет разный.
Сергей: перепроверю соответствия типов, может быть тут лоханулся.
Уточните правильно ли я понял информацию про t_x502_hnd:
1. Для OS 64 бита длинна указателя будет 8 байт - тип long
2. Для OS 32 бита длинна указателя будет 4 байта - тип int
?
Спасибо.
Добрый день,
Параметры среды:
1. ubuntu 14.04.5 (libe502api.so.1.1.9)
2. прошивка e502-m4.bin
3. L-Card Measurement Studio 1.2.2 работает нормально как по сети, так и через USB
4. JNA (проверял на 4.2.0 и 4.5.0)
После обновления прошивки, на приведенном выше примере, а именно в месте
double[] facq = new double[]{20000};
double[] fframe = new double[]{20000};
int res = e502.X502_SetAdcFreq(handle, facq, fframe);
получаю код "-7"
В т.ч. при попытке установить соединение через IP (E502 напрямую соединен кабелем с компьютером, пинг проходит, файрвола нет)
int res = e502.E502_OpenByIpAddr(
handle,
0xC0A80032,// 192.168.0.50,
0,
1000
);
возвращает код "-155"
В чем может быть проблема ?
Спасибо за пример!
Мы можем включить на его основе поддержку E502/L502 в Java, но для этого нужно сперва самим посмотреть код, проверить сборку, включить все недостающие функции как L502, так и E502, чтобы дальше его можно было сопровождать. Я посмотрю код, только детально смогу это сделать где-то через неделю или две, тогда постараюсь включить поддержку в штатный наш SDK.
Отлично, Спасибо.
Нашел самый простой способ использования библиотек из Java. Было бы очень неплохо получить поддержку интерфейса E502Api от производителя (по сути это только сопровождение одного интерфейса с описанием методов и константы).
Пример Java кода приведен ниже.
1. в ОС должна быть установлена библиотека e502api для вот этой строки E502Api e502 = (E502Api) Native.loadLibrary("e502api", E502Api.class);
2. Maven deps
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.2.0</version>
</dependency>
3. Java
package com.i4biz.experiments.e502;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.PointerType;
/**
* http://github.com/java-native-access/jn … master/www
*/
public class LibC {
public enum t_x502_streams {
X502_STREAM_ADC(0x01),
X502_STREAM_DIN(0x02),
X502_STREAM_DAC1(0x10),
X502_STREAM_DAC2(0x20),
X502_STREAM_DOUT(0x40),
X502_STREAM_ALL_IN((X502_STREAM_ADC.value | X502_STREAM_DIN.value)),
X502_STREAM_ALL_OUT((X502_STREAM_DAC1.value | X502_STREAM_DAC2.value | X502_STREAM_DOUT.value));
public int value;
t_x502_streams(int value) {
this.value = value;
}
}
public enum t_x502_mode {
X502_MODE_FPGA(0),
X502_MODE_DSP(1),
X502_MODE_DEBUG(2);
public int value;
t_x502_mode(int value) {
this.value = value;
}
}
public enum t_x502_lch_mode {
X502_LCH_MODE_COMM(0),
X502_LCH_MODE_DIFF(1),
X502_LCH_MODE_ZERO(2);
public int value;
t_x502_lch_mode(int value) {
this.value = value;
}
}
public enum t_x502_adc_range {
X502_ADC_RANGE_10(0),
X502_ADC_RANGE_5(1),
X502_ADC_RANGE_2(2),
X502_ADC_RANGE_1(3),
X502_ADC_RANGE_05(4),
X502_ADC_RANGE_02(5);
public int value;
t_x502_adc_range(int value) {
this.value = value;
}
}
public enum t_x502_ref_freq {
X502_REF_FREQ_2000KHZ(2000000), X502_REF_FREQ_1500KHZ(1500000);
public int value;
t_x502_ref_freq(int value) {
this.value = value;
}
}
public enum t_x502_proc_flags {
X502_PROC_FLAGS_VOLT(0x00000001),
X502_PROC_FLAGS_DONT_CHECK_CH(0x00010000);
public int value;
t_x502_proc_flags(int value) {
this.value = value;
}
}
public interface E502Api extends Library {
int E502_UsbGetSerialList(long[] serials, int size, int flags, PointerType devcnt);
long X502_Create();
int E502_OpenUsb(long handle, String serial);
int X502_SetMode(long handle, int mode);
int X502_Close(long handle);
int X502_Free(long handle);
// ==============================
int X502_Configure(long hnd, int flags);
int X502_SetLChannelCount(long hnd, int lch_cnt);
int X502_SetLChannel(long hnd, int lch, int phy_ch, int mode, int range, int avg);
int X502_SetRefFreq(long hnd, int freq);
int X502_SetAdcFreq(long hnd, double[] f_acq, double[] f_frame);
// ==============================
int X502_StreamsEnable(long handle, int streams);
int X502_StreamsDisable(long hnd, int streams);
int X502_StreamsStart(long handle);
int X502_StreamsStop(long hnd);
int X502_Recv(long handle, int[] buffer, int size, int tout);
int X502_ProcessData(long hnd,
int[] src, int size, int flags,
double[] adc_data, int[] adc_data_size,
int[] din_data, int[] din_data_size);
}
public static void main(String[] args) throws Exception {
E502Api e502 = (E502Api) Native.loadLibrary("e502api", E502Api.class);
// long[] serials = new long[10];
// int res = e502.E502_UsbGetSerialList(serials, serials.length, 1, null);
// if (res == 0) {
// throw new Exception("No devices found.");
// }
// long serial = serials[0];
// System.out.println("Serial: " + serial);
long handle = e502.X502_Create();
System.out.println("Handle: " + handle);
try {
e502.E502_OpenUsb(handle, null);
e502.X502_SetMode(handle, t_x502_mode.X502_MODE_FPGA.value);
{//configure channels
e502.X502_SetLChannelCount(handle, 1);
//первый логический канал соответствует измерению 1 канала относительно общей земли
e502.X502_SetLChannel(handle, 0, 0, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, 0);
//второй логический канал соответствует измерению 16 канала
// e502.X502_SetLChannel(handle, 1, 15, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, $
//третий логический канал - измерение 17-го канала
// e502.X502_SetLChannel(handle, 2, 16, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, $
e502.X502_SetRefFreq(handle, t_x502_ref_freq.X502_REF_FREQ_2000KHZ.value);
double[] facq = new double[]{20000};
double[] fframe = new double[]{20000};
e502.X502_SetAdcFreq(handle, facq, fframe);
e502.X502_Configure(handle, 0);
}
e502.X502_StreamsEnable(handle, t_x502_streams.X502_STREAM_ADC.value);
e502.X502_StreamsStart(handle);
boolean a = true;
while (a) {
int[] buffer = new int[1000];
int readWordsAmount = e502.X502_Recv(handle, buffer, buffer.length, 0);
double[] adc_data = new double[1000];
int[] adc_data_size = new int[]{adc_data.length};
e502.X502_ProcessData(
handle, buffer, readWordsAmount,
t_x502_proc_flags.X502_PROC_FLAGS_VOLT.value,
adc_data, adc_data_size,
null, null
);
System.out.println(System.currentTimeMillis() + " : " + readWordsAmount + " : " + adc_data_size[0]);
for (int i = 0; i < adc_data_size[0]; i++) {
System.out.println(adc_data[ i ]);
}
Thread.sleep(1000);
}
e502.X502_StreamsStop(handle);
e502.X502_StreamsDisable(handle, t_x502_streams.X502_STREAM_ADC.value);
e502.X502_Close(handle);
} finally {
e502.X502_Free(handle);
}
}
}
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск