внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение diakin » 08.11.2014 15:20:34

Hi, All!
Есть проект на Delphi 6.0 - пример использования АЦП Е-154. (консольная программа осуществляет потоковый сбор данных с первых 4 каналов АЦП)
Пытаюсь его перевести под Lazarus.
Проект компилится, запускается, пишет в консоль
DLL Version --> OK
Module Interface --> OK
,но потом вываливается с ошибкой Sigsegv при попытке обращения к функциям интерфейса модуля
// интерфейс модуля E-154
pModule : ILE154;
например
// попробуем обнаружить модуль E-154 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1) do if pModule.OpenLDevice(i) then break;

Функции определены здесь.
Код: Выделить всё
предок всех классов для USB устройств от L-Card
// *****************************************************************************

type
   Lusbbase = class
      // функции общего назначения для работы с USB устройствами
      Function OpenLDevice(VirtualSlot : WORD) : BOOL; virtual; stdcall; abstract;
      Function CloseLDevice : BOOL; virtual; stdcall; abstract;
      Function ReleaseLInstance : BOOL; virtual; stdcall; abstract;
      // получение дескриптора устройства USB
      Function GetModuleHandle : THandle; virtual; stdcall; abstract;
      // получение названия используемого модуля
      Function GetModuleName(ModuleName : pAnsiChar) : BOOL; virtual; stdcall; abstract;
      // получение текущей скорости работы шины USB
      Function GetUsbSpeed(UsbSpeed : pBYTE) : BOOL; virtual; stdcall; abstract;
      // управления режимом низкого электропотребления модуля
      Function LowPowerMode(LowPowerFlag : BOOL) : BOOL; virtual; stdcall; abstract;
      // функция выдачи строки с последней ошибкой
      Function GetLastErrorInfo(LastErrorInfo : pLAST_ERROR_INFO_LUSBAPI) : BOOL; virtual; stdcall; abstract;
   end;                   



Честно говоря не очень во всем этом ориентируюсь. Возможно, какая-нибудь мелочь ) Что тут можно сделать, куда копать?
Если кому будет интересно, проект лежит на сайте производителя
http://www.lcard.ru/download/e154_examples_source.zip
diakin
незнакомец
 
Сообщения: 2
Зарегистрирован: 07.11.2014 10:12:35

Re: внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение mig-31 » 10.11.2014 15:55:38

Наверно не получаешь указатель на pModule : ILE154
Прикрепи Lusbapi.pas и lusbapi.dll
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение diakin » 19.11.2014 01:02:00

Код: Выделить всё
   // попробуем получить указатель на интерфейс для модуля E-154
   pModule := CreateLInstance(pCHAR('e154'));
   if pModule = nil then AbortProgram('Не могу найти интерфейс модуля E-154!')
   else WriteLn(' Module Interface --> OK');

   // попробуем обнаружить модуль E-154 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
   for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1) do if pModule.OpenLDevice(i) then break;
   // что-нибудь обнаружили?
   if i = MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then AbortProgram('Не удалось обнаружить модуль E-154 в первых 127 виртуальных слотах!')
   else WriteLn(Format(' OpenLDevice(%u) --> OK', [i]));
                                                                   

Пишет в консоли
DLL Version --> OK
Module Interface --> OK // указатель на интерфейс получает
OpenLDevice(126) --> OK // (это вообще откуда??? какой-то левый глюк)

laz1.png


Прикрепи Lusbapi.pas и lusbapi.dll

В смысле прикрепить к сообщению ? :?:

Добавлено спустя 11 минут 25 секунд:
Вот еще посоветовали
Я бы посоветовал копать в направлении размеров типов данных и выравнивания внутри структур. Одни и те же типы в разных версиях Дельфи порой оказываются разных размеров, чтобы программистам было не скучно.
Похоже, что где-то какой-то record получается не той же бинарной структуры, что соответствующий struct в C/C++.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
diakin
незнакомец
 
Сообщения: 2
Зарегистрирован: 07.11.2014 10:12:35

Re: внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение mig-31 » 20.11.2014 12:57:06

Я бы посоветовал копать в направлении размеров типов данных и выравнивания внутри структур. Одни и те же типы в разных версиях Дельфи порой оказываются разных размеров, чтобы программистам было не скучно.
Похоже, что где-то какой-то record получается не той же бинарной структуры, что соответствующий struct в C/C++.

Я бы тоже капал в этом направлении.

Прикрепи к сообщению zip с сконвентированным проектом и со всеми нужными *.pas файлами.

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

На первый взгдяд, библиотека зря использует сложные типы данных и сложнее, чем могла бы быть.
Мы используем карты National Instruments и примеры на С состоят из вызова 5-6 функций. Их легко перевести на FreePascal.
Последний абзац - это мое субъективное мнение и не реклама NI.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение v-t-l » 21.11.2014 12:49:31

Код: Выделить всё
// попробуем обнаружить модуль E-154 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
   for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1) do if pModule.OpenLDevice(i) then break;
   // что-нибудь обнаружили?
   if i = MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then AbortProgram('Не удалось обнаружить модуль E-154 в первых 127 виртуальных слотах!')
   else WriteLn(Format(' OpenLDevice(%u) --> OK', [i]));

Я бы не стал полагаться на значение i по выходу из for.

Код: Выделить всё
   i:=0;
   while (i<MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI) and (not pModule.OpenLDevice(i)) do i:=i+1;
   if i = MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then AbortProgram(Format('Не удалось обнаружить модуль E-154 в первых %u виртуальных слотах!'),[i-1]))
   else WriteLn(Format(' OpenLDevice(%u) --> OK', [i]));
v-t-l
энтузиаст
 
Сообщения: 741
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: внешний модуль АЦП/ЦАП на шину USB E-154 фирмы L-Card

Сообщение Sergei I. Gorelkin » 21.11.2014 13:09:33

Конкретно в FPC цикл for реализован так, что счетчик имеет правильное значение в случае выхода из цикла. Попытки отслеживать факт использования счетчика после цикла и оптимизации в случае не-использования были, но развития не получили.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 223

Рейтинг@Mail.ru
cron