файл 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);