Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Конвертация библиотеки Dll c WinAPI в COM (.NetC#

Вы не вошли.

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

Андрей
25.09.2009 09:48:07
#1

Гость

Конвертация библиотеки Dll c WinAPI в COM (.NetC#

Конвертация  библиотеки Dll c WinAPI в COM (.NetC#)изделия E14-440
Выводит ошибку :
Ошибка внутренней функции SetAvrAttributes(). Не выполнился сброс дополнительных аттрибутов работы микроконтроллера модуля. Вопрос что делать в таком случае?
С уважением Андрей)

Андрей
25.09.2009 09:48:52
#2

Гость

Re: Конвертация библиотеки Dll c WinAPI в COM (.NetC#

файл USB.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using DWORD = System.UInt32;
using LONG = System.Int32;
using WORD = System.UInt16;
using SHORT = System.Int16;
using HINSTANCE = System.Int32;
using HANDLE = System.IntPtr;

// идентификатор устройства
        HANDLE hDevice;
//const
public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
const uint FILE_DEVICE_UNKNOWN = 0x00000022;
const uint METHOD_OUT_DIRECT = 2;
const int FILE_ANY_ACCESS = 0;


/// <summary>
        /// Данный код предписывает драйверу выполнить инициализацию (сброс) канала,
        /// обеспечивающего потоковые пересылки для чтения данных из модуля (Reset Read Pipe).
        /// </summary>

        int DIOC_RESET_PIPE3 = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x6, METHOD_OUT_DIRECT, FILE_ANY_ACCESS);

/// <summary>
        /// посылка в модуль номера команды
        /// </summary>
        /// <param name="Command"></param>
        /// <returns></returns>
   public bool SEND_COMMAND(WORD Command)
        {
            WORD[] InBuf = new WORD[4];
            int cbRet = 0;
            WORD TimeOut = 500;

            // вендор посылки командного прерывания в DSP
            InBuf[0] = 0; InBuf[1] = V_COMMAND_IRQ_E440; InBuf[2] = 0x0; InBuf[3] = 0x0;

            // виртуальный слот доступен?
            if (hDevice == INVALID_HANDLE_VALUE) { LastError = E440_ERROR_ID_01; return false; }
            // зашлем номер команды
            else if (Command >= C_LAST_COMMAND_E440) { LastError = E440_ERROR_ID_19; return false; }
            else if (!PUT_LBIOS_WORD(L_COMMAND_E440, Command)) { LastError = E440_ERROR_ID_15; return false; }
            // сгенерим командное прерывание в DSP
            else if (!DeviceIoControl(hDevice, DIOC_SEND_COMMAND, InBuf, 4 * sizeof(WORD), NULL, 0, out cbRet, NULL)) { LastError = E440_ERROR_ID_02; return false; }

            // проверим, что команда опознана
            do
            {
                if (!GET_LBIOS_WORD(L_COMMAND_E440, (SHORT*)&Command)) { LastError = E440_ERROR_ID_13; return false; }
            } while ((Command & (TimeOut--)) != 0);
            if (TimeOut == 0xFFFF) { LastError = E440_ERROR_ID_20; return false; }

            return true;
        }


  /// Разрешение работы АЦП
        /// Данная функция запускает модуль на перманентный сбор данных с АЦП, расмещая полученные
        /// отсчёты в циклическом FIFO буфере АЦП. Параметры работы АЦП предварительно передаются
        /// в модуль с помощью интерфейсной функции FILL_ADC_PARS(). 
        /// Извлечение из модуля уже собранных с АЦП данных можно осуществлять с помощью интерфейсной
        /// функции ReadData().
        /// </summary>
        /// <returns></returns>
        public bool START_ADC()
        {
            Console.WriteLine("Разрешение работы АЦП");

            WORD[] InBuf = new WORD[4];
            int cbRet = 0;

            // виртуальный слот доступен?
            if (hDevice == INVALID_HANDLE_VALUE)
            {
                LastError = E440_ERROR_ID_01;
                return false;
            }
            // остановим АЦП
            else if (!STOP_ADC())
            {

                LastError = E440_ERROR_ID_29;
                return false;
            }

            // а теперь запустим его заново
            InBuf[0] = 0;
            InBuf[1] = V_START_ADC_E440;/* номер запроса*/
            InBuf[2] = 0x0 | DM_E440;// базовый адрес FIFO буфера АЦП
            InBuf[3] = (WORD)(am.AdcFifoLength / 2.0);// половина длины FIFO буфера АЦП
            if (!DeviceIoControl(hDevice, DIOC_SEND_COMMAND, InBuf, InBuf.Length * sizeof(WORD), NULL, 0, out cbRet, NULL)) { LastError = E440_ERROR_ID_02; return false; }
            else if (!DeviceIoControl(hDevice, DIOC_RESET_PIPE3/*reset Read Pipe*/, null, 0, NULL, 0, out cbRet, NULL)) { LastError = E440_ERROR_ID_02; return false; }
            else if (!SEND_COMMAND(C_START_ADC_E440)) { LastError = E440_ERROR_ID_17; return false; }

            return true;
        }

       
        /// <summary>
        /// останов АЦП
        /// </summary>
        /// <returns></returns>
        public bool STOP_ADC()
        {
            // виртуальный слот доступен?
            if (hDevice == INVALID_HANDLE_VALUE) { LastError = E440_ERROR_ID_01; return false; }
            // команда выключения АЦП
            if (!SEND_COMMAND(C_STOP_ADC_E440)) { LastError = E440_ERROR_ID_17; return false; }
            return true;
        }

Файл Program.cs

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public static unsafe void Main()
        {
            SuperUSB usb = new SuperUSB();
           for (ushort i = 0; i < SuperUSB.MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++)
              if (usb.OpenLDevice(i))
             {
                    Console.WriteLine("Открылось: " + i);
                }
                else
                {
                    Console.WriteLine(usb.LastError);
                }
            if(!usb.START_ADC())
              Console.WriteLine(usb.LastError);