Форум: Техническая поддержка

Тема: написание софта под Е14-140 на С#

Вы не вошли.

 Поиск | Регистрация | Вход 

Антон
13.02.2013 22:29:32
#1

Гость

написание софта под Е14-140 на С#

Здравствуйте уважаемые разработчики Е14-140! Возник острый вопрос по адаптации Е14-140 в среде С#! Пробую перевести структуры и классы из С++ и Delphi на С# и все четно, - проблема в обращении к ДЛЛ... почитал форум и подходящей информации не нашел на разных ветках!(
Прошу помощи у всех кто с такой проблемой боролся, а именно на С# достучаться до "Lusbapi.dll"!!!
Могу продемонстрировать, что я накрутил, а Вы подскажите может чего не работает?!
Огромное Спасибо!

14.02.2013 11:34:38
#2

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Конечно. Или просто опишите, что именно не получается.
Вот какая-то довольно обстоятельная статья про вызов DLL из-под CLR:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

Антон
14.02.2013 13:21:24
#3

Гость

Re: написание софта под Е14-140 на С#

Посмотрите правильно ли я обращаюсь к функции CreateLInstance("e140"):
Представление класса:
   public abstract class _ILUSBBASE : ILUSBBASE
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        // функции общего назначения для работы с USB устройствами
        public abstract bool OpenLDevice(ushort VirtualSlot);
        public abstract bool CloseLDevice();
        public abstract bool ReleaseLInstance();
        // получение дескриптора устройства USB
        public abstract IntPtr GetModuleHandle();
        // получение названия используемого модуля
        public abstract bool GetModuleName(string ModuleName);
        // получение текущей скорости работы шины USB
        public abstract bool GetUsbSpeed( ref byte UsbSpeed);
        // управления режимом низкого электропотребления модуля
        public abstract bool LowPowerMode(bool LowPowerFlag);
        // функция выдачи строки с последней ошибкой
        public abstract bool GetLastErrorInfo(ref LAST_ERROR_INFO_LUSBAPI LastErrorInfo);
    };
    public interface ILUSBBASE { }
//-----------------------------------------------------------------------------
// интерфейс для модуля E14-140
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential)]
    public abstract class ILE140 : ILUSBBASE
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        // функции для работы с АЦП
        public abstract bool GET_ADC_PARS(ref ADC_PARS_E140 AdcPars);
        public abstract bool SET_ADC_PARS(ref ADC_PARS_E140 AdcPars);
        public abstract bool START_ADC();
        public abstract bool STOP_ADC();
        public abstract bool ADC_KADR(ref short Data);
        public abstract bool ADC_SAMPLE(ref short AdcData, ushort AdcChannel);
        public abstract bool ReadData(ref IO_REQUEST_LUSBAPI ReadRequest);

        // функции для работы с ЦАП
        public abstract bool GET_DAC_PARS(ref DAC_PARS_E140 DacPars);
        public abstract bool SET_DAC_PARS(ref DAC_PARS_E140 DacPars);
        public abstract bool START_DAC();
        public abstract bool STOP_DAC();
        public abstract bool WriteData(ref IO_REQUEST_LUSBAPI WriteRequest);
        public abstract bool DAC_SAMPLE(ref short DacData, ushort DacChannel);
        public abstract bool DAC_SAMPLES(ref short DacData1,ref short DacData2);

        // функции для работы с ТТЛ линиями
        public abstract bool ENABLE_TTL_OUT(bool EnableTtlOut);
        public abstract bool TTL_IN(ref ushort TtlIn);
        public abstract bool TTL_OUT(ushort TtlOut);

        // функции для работы с пользовательской информацией ППЗУ
        public abstract bool ENABLE_FLASH_WRITE(bool IsUserFlashWriteEnabled);
        public abstract bool READ_FLASH_ARRAY(ref USER_FLASH_E140 UserFlash);
        public abstract bool WRITE_FLASH_ARRAY(ref USER_FLASH_E140 UserFlash);

        // функции для работы со служебной информацией ППЗУ
        public abstract bool GET_MODULE_DESCRIPTION(ref MODULE_DESCRIPTION_E140 ModuleDescription);
        public abstract bool SAVE_MODULE_DESCRIPTION(ref MODULE_DESCRIPTION_E140 ModuleDescription);

        // функции для прямого досупа к микроконтроллеру
        public abstract bool GetArray(ref byte _Buffer, ushort Size, ushort Address);
        public abstract bool PutArray(ref byte _Buffer, ushort Size, ushort Address);
    };
//,...................
[DllImport("Lusbapi.dll",
                    CallingConvention = CallingConvention.StdCall,
                    CharSet = CharSet.Ansi)]
        public static extern IntPtr CreateLInstance(string DeviceName);
//...................
//.... и ошибка!!! ....
ILE140 pModule = null;
            pModule = (ILE140)CreateLInstance("e140");

Помогите правильно вызвать Вашу функцию или представить класс в C#...
Если есть возможность можно выслать пример мне на емаил?!
Спасибо!!!

Антон
15.02.2013 11:32:06
#4

Гость

Re: написание софта под Е14-140 на С#

Я вот что подумал: или городить еще одну ДЛЛ откуда экспортируются уже отдельно каждая функция для программы на С#?!

15.02.2013 12:00:41
#5

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Можно и так, т.е. можно написать обертку с интерфейсом в стиле C, безо всяких виртуальных методов.

Кроме того, есть альтернативная (вместо lusbapi) библиотека lcomp, там нет таких недо-COM интерфейсов.

Есть довольно много похожих тем на форумах, посмотрите, например, ссылки по запросу
http://www.google.com/search?q=c%2B%2B+ … %23+intptr

P.S. Извините за задержку, я не специалист по C#, коллеги по возможности ответят.

15.02.2013 12:10:51
#6

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Вот еще какая-то амбициозная штука для Mono, не может помочь?
http://tirania.org/blog/archive/2011/Dec-19.html

Или даже http://en.wikipedia.org/wiki/SWIG

Антон
15.02.2013 13:09:38
#7

Гость

Re: написание софта под Е14-140 на С#

Спасибо, буду разбираться!

Антон
15.02.2013 13:31:17
#8

Гость

Re: написание софта под Е14-140 на С#

Легче на с++ свою ДЛЛ склепать под ВАШУ...

15.02.2013 14:01:09
#9

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Я думаю, что легче всего, наверное, склепать wrapper с C-интерфейсом, т.е. еще одну DLL с функциями типа
BOOL WINAPI E140_GetModuleName(ILE140* inst, LPSTR dest)
    {
    return inst->GetModuleName(dest);
    }
и т.д.
После чего можно просто отдавать IntPtr через p/invoke и не возиться с виртуальными методами.

В принципе можно и переделать lusbapi, поскольку она ищет с исходниками. Но тогда смена версии сложнее.

15.02.2013 14:01:57
#10

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

s/ищет/идет/

15.02.2013 14:14:47
#11

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Нечто похожее, но не совсем (там еще универсализация вызовов для разных приборов) представляет собой wlusbapi в
http://www.lcard.ru/download/lusbapi_e1 … abview.zip

15.02.2013 14:34:30
#12

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: написание софта под Е14-140 на С#

Если выберите путь написания библиотеки/обертки на C с отдельной функцией на каждый метод, как было предложено выше, то потом  для С функций обертка на C# пишется уже не сложно - это мне приходилось делать для других проектов, если будут вопросы, могу помочь.

А вот использовать C++ классы в С# мне не приходилось и насколько это возможно я точно не знаю.

Антон
16.02.2013 18:30:18
#13

Гость

Re: написание софта под Е14-140 на С#

Алексей (L-Card) Есть ли у Вас время для рассмотрения моего проекта?! Я его могу скинуть Вам на емаил... осталась только одна ошибка и не могу понять какая... - компилятор все пропускает, но при выполнении вылетает ошибка и не доходит с чем она связана?!
Спасибо!

17.02.2013 10:26:56
#14

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: написание софта под Е14-140 на С#

Можете скинуть проект мне на почту. Не могу обещать, что сразу, но как будет возможность - посмотрю

Антон
17.02.2013 14:46:31
#15

Гость

Re: написание софта под Е14-140 на С#

Отправил! Спасибо!

Антон
19.02.2013 13:25:23
#16

Гость

Re: написание софта под Е14-140 на С#

Ребята еще вопрос, а у Вас, случайно, нет исходника ДЛЛ  lusbapi на VS20xx С++?! а то с Борланом возится не охота!) Если есть, не затруднит, вышлите мне  на емаил!

19.02.2013 17:13:53
#17

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: написание софта под Е14-140 на С#

Исходники lusbapi есть только одни, которые в архиве. Но там, по-моему, нет ничего специфического для компилятора, практически чистое win32api.
Должна собраться и msvc

Антон
20.02.2013 13:59:37
#18

Гость

Re: написание софта под Е14-140 на С#

Уважаемые разработчики, вопрос возник !
Прошу Вас посмотреть тему мной созданную на форуме программистов и ответить
http://forum.sources.ru/index.php?showtopic=372756
СПасибо!

21.02.2013 13:29:36
#19

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: написание софта под Е14-140 на С#

А саму структуру Вы правильно заполняете, если на C этот же код выполнить - то функция вернет TRUE?

Антон
21.02.2013 14:24:20
#20

Гость

Re: написание софта под Е14-140 на С#

Значит я определил в чем причина ... внутри ДЛЛ-обертки сделал вызов GET_ADC_PARS() и потом передачу   SET_ADC_PARS() т.е. в функции:
E140FORCSARP_API BOOL WINAPI fnE140ForCSarpSET_ADC_PARS(ADC_PARS_E140 *ap)
{
    ADC_PARS_E140 _ap;
    // получим текущие параметры работы АЦП
    if(!pModule->GET_ADC_PARS(&_ap)) return false;
    else
    {// установим желаемые параметры работы АЦП
    /*    _ap.ClkSource =            ap->ClkSource;                            // внутренний запуск АЦП
        _ap.EnableClkOutput =    ap->EnableClkOutput;     // без трансляции тактовых импульсо АЦП
        _ap.InputMode =            ap->InputMode;                                    // без синхронизации ввода данных
        _ap.ChannelsQuantity =    ap->ChannelsQuantity;                     // кол-во активных каналов       
        _ap.AdcRate =            ap->AdcRate;                                // частота работы АЦП в кГц
        _ap.InterKadrDelay =    ap->InterKadrDelay;                            // межкадровая задержка в мс
        _ap.KadrRate =            ap->KadrRate;
        _ap.SynchroAdChannel =    ap->SynchroAdChannel;
        _ap.SynchroAdMode =        ap->SynchroAdMode;
        _ap.SynchroAdPorog =    ap->SynchroAdPorog;
        _ap.SynchroAdType =        ap->SynchroAdType;
            int i;
        // формируем управляющую таблицу
            for(i = 0x0; i < _ap.ChannelsQuantity; i++) _ap.ControlTable[i] = ap->ControlTable[i];
*/
    // передадим требуемые параметры работы АЦП в модуль
    return(pModule->SET_ADC_PARS(&_ap));
        //return true;
    }
и ВАША функция SET_ADC_PARS() возвращает FALSE, в любых комбинациях с переменными структуры, к стати из С# все передается!
В чем причина с функцией SET_ADC_PARS()???

Антон
21.02.2013 14:25:51
#21

Гость

Re: написание софта под Е14-140 на С#

Заполняю структуру как у ВАС в примере! Ни чего своего!

21.02.2013 14:36:10
#22

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: написание софта под Е14-140 на С#

Высылайте то, что написали на данный момент. Вроде время появилось - через пол часа посмотрю

Антон
21.02.2013 14:53:18
#23

Гость

Re: написание софта под Е14-140 на С#

Вышлю ДЛЛ и С# проект?!

Антон
21.02.2013 15:05:42
#24

Гость

Re: написание софта под Е14-140 на С#

Отправил!

21.02.2013 17:16:49
#25

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: написание софта под Е14-140 на С#

Не за что) Если будут еще вопросы - обращайтесь

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск