|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
e2010b feat InitStartLDevice
Здравствуйте, на основе рекомендованного примера l7xx.tst пытаюсь почитать lcard e2010b. Функция InitStartLDevice () завершается с ошибкой (GetLastError: 259). Все предыдущие операции выполняю как в примере - проверял, вроде бы ничего не забыл. К входам АЦП ничего не подключено. Пожалуйста подскажите, что я делаю не так. спасибо за ответ, с уважением, С.А. Приложение: ULONG *sync, tid;
USHORT complete, *fdata, *data;
USHORT IrqStep = 1024;//777-777%7; // половинка буфера кратная числу каналов
USHORT FIFO = 1024; //
USHORT pages = 128;
USHORT multi = 4; // - количество половинок кольцевого буфера, которое мы хотим собрать
long fsize;
ULONG WINAPI ServiceThread (PVOID /*Context*/) {...}
void e2010b_setup (ADC_PAR * adcPar)
{
adcPar->t2.s_Type = L_ADC_PARAM;
adcPar->t2.AutoInit = 1;
adcPar->t2.dRate = 1000.0;
adcPar->t2.dKadr = 0.0;
adcPar->t2.SynchroType = 0x01;
adcPar->t2.SynchroSrc = 0x00;
adcPar->t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
adcPar->t2.NCh = 2;
adcPar->t2.Chn[0] = 0x0;
adcPar->t2.Chn[1] = 0x1;
adcPar->t2.Chn[2] = 0x2;
adcPar->t2.Chn[3] = 0x3;
adcPar->t2.FIFO = 32768;
adcPar->t2.IrqStep = 32768;
adcPar->t2.Pages = 32;
adcPar->t2.IrqEna = 1;
adcPar->t2.AdcEna = 1;
adcPar->t2.StartCnt = 0;
adcPar->t2.StopCnt = 5500;
adcPar->t2.DM_Ena = 0;
adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
adcPar->t2.AdPorog = 0;
std::cout << "Pages: " << adcPar->t2.Pages << std::endl;
std::cout << "IrqStep: " << adcPar->t2.IrqStep << std::endl;
std::cout << "FIFO: " << adcPar->t2.FIFO << std::endl;
std::cout << "Rate: " << adcPar->t2.dRate << std::endl;
adcPar->t2.dRate = 0;
std::cout << "Pages: " << adcPar->t2.Pages << std::endl;
std::cout << "IrqStep: " << adcPar->t2.IrqStep << std::endl;
std::cout << "FIFO: " << adcPar->t2.FIFO << std::endl;
std::cout << "Rate: " << adcPar->t2.dRate << std::endl;
}
int main (int argc, char * argv[])
{
HINSTANCE hComponent = ::LoadLibrary (L"lcomp.dll");
if ( hComponent == NULL )
return 0;
CREATEFUNCPTR CreateInstance =
(CREATEFUNCPTR) ::GetProcAddress (hComponent, "CreateInstance");
LUnknown * pIUnknown = CreateInstance (0);
if ( pIUnknown == NULL ) {
std::cout << "-" << GetLastError ();
return 1;
}
IDaqLDevice * pI;
HRESULT hr = pIUnknown->QueryInterface (IID_ILDEV, (void**)&pI);
if (! SUCCEEDED (hr))
return 1;
pIUnknown->Release ();
// Начало работы с платой
pI->OpenLDevice ();
pI->LoadBios ("e2010");
PLATA_DESCR_U2 pd;
pI->ReadPlataDescr (& pd);
DWORD tm = 10000000;
pI->RequestBufferStream (&tm, L_STREAM_ADC);
std::cout << "Allocated memory size(word): " << tm << std::endl;
ADC_PAR adcPar;
e2010b_setup (&adcPar);
pI->FillDAQparameters (&adcPar.t2);
pI->SetParametersStream (&adcPar.t2, &tm, (void **)&data, (void **)&sync,
L_STREAM_ADC);
IrqStep = adcPar.t2.IrqStep;
pages = adcPar.t2.Pages;
fsize = multi * (pages / 2) * IrqStep;
HANDLE hFile = CreateFile (L"data.dat", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_RANDOM_ACCESS,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "File open error";
return -1;
}
HANDLE hMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 2 * fsize, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "File mapping error";
return -1;
}
fdata = (WORD *) MapViewOfFile (hMap, FILE_MAP_WRITE, 0, 0, 0);
complete = 0;
// pI->EnableCorrection ();
pI->InitStartLDevice (); //L_STREAM_ADC);
!!!!!!!!!! ЗДЕСЬ - ОШИБКА 259 std::cout << GetLastError() << std::endl;
// HANDLE hThread = CreateThread (0, 0x2000, ServiceThread, 0, 0, & tid);
// Запускаем сбор в драйвере
ULONG status = pI->StartLDevice ();//L_STREAM_ADC);
std::cout << GetLastError() << std::endl;
// Печатаем индикатор сбора данных
while (! complete) {
// std::cout << GetLastError() << std::endl;
Sleep(2000
);
}
std::cout << "StartLDevice returned "
<< (status ? "TRUE":"FALSE")
<< std::endl;
// Завершение работы
pI->CloseLDevice ();
// Закрытие интерфейса
pI->Release ();
}
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
если именно e2010b, то биос грузить нужно e2010m
|
|
|
Re: e2010b feat InitStartLDevice
Здравствуйте, спасибо за ответы, BIOS поменял на е2010m.pld. Дальше я провел замеры результатов GetLastError() для функций InitStartLDevice () и StartLDevice (), получил соответственно значения 259 и 536870912. При этом обе эти функции возвращают L_SUCCESS (0). Значит ли это, что они отрабатывают правильно и успешно? спасибо, С.А.
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
если сбор пошел то успешно.
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
сбор не пошел, программа сваливается в ошибку. Таким образом я пытался опроверить где находится ее источник - в потоке, который читает буфер или в функциях работы с устройством. спасибо
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
|
|
|
Re: e2010b feat InitStartLDevice
Тестовый пример компилируется у меня с ошибками - я его собираю в MinGW. Я проверил сегодня - StartLDevice () завершилась успешно, но сбор не начался. тестовый примерю сейчас в VisualC
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
В Visual C++ скомпилировать пример l7xx.tst быстро не удалось. Запустил версию этого примера, поставляемую вместе с библиотекой из папки Release_md64. Выглядит так, что похоже не работает. Я сделал скрин с результатов работы, выложил его по ссылке https://yadi.sk/i/JOZBf7PDcKVGo После настройки сбора данных, создания файла, инициализации LCard, старта записи буфер .......... Starting ... SUCCESS -> CreateFile(data.dat) SUCCESS -> CreateFileMapping(data.dat) SUCCESS -> MapViewOfFile(data.dat) SUCCESS -> InitStartLDevice(ADC) SUCCESS -> StartLDevice(ADC) индикатор сбора данных ........... 0 остается неизменным в течение 2 и более минут, затем по нажатию кнопки на клавиатуре, программа может быть остановлена пользователем. спасибо
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
Ладно. А если L-Graph2 установить и там попробовать с модулем поработать?
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
C L-Graph2 я начинал работу с устройством - там все работает. Может быть, что дело в настройках? Сначала взял настройки из примера, поставляемого вместе с библиотекой, результат я вчера описал. Сегодня поменял на вот такие:
adcPar->t2.s_Type = L_ADC_PARAM;
adcPar->t2.AutoInit = 1;
adcPar->t2.dRate = 5000.0;
adcPar->t2.dKadr = 0.01;
adcPar->t2.SynchroType = 0x01;
adcPar->t2.SynchroSrc = 0x00;
adcPar->t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
adcPar->t2.NCh = 4;
adcPar->t2.Chn[0] = 0x0;
adcPar->t2.Chn[1] = 0x1;
adcPar->t2.Chn[2] = 0x2;
adcPar->t2.Chn[3] = 0x3;
adcPar->t2.FIFO = 32768;
adcPar->t2.IrqStep = 32768;
adcPar->t2.Pages = 32;
adcPar->t2.IrqEna = 1;
adcPar->t2.AdcEna = 1;
adcPar->t2.StartCnt = 0;
adcPar->t2.StopCnt = 500;
adcPar->t2.DM_Ena = 1;
adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
adcPar->t2.AdPorog = 1;
результат, тот же, спасибо
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
это все по 0 adcPar->t2.StartCnt = 0; adcPar->t2.StopCnt = 0; adcPar->t2.DM_Ena = 0; adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; adcPar->t2.AdPorog = 0 и еще, а сейчас то с Д-Graph2 оно все еще работает? lcomp.exe последний с сайта?
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
да работает, я испытывал L-Graph 2 вчера вечером перед тем как вам написать (тогда же и выкачал его). Когда я читаю состояние устройства PLATA_DESCR_U2 pd;
pI->ReadPlataDescr (& pd);
std::cout << "SerNum " << pd.t6.SerNum << std::endl
<< "BrdName " << pd.t6.BrdName << std::endl
<< "Rev " << pd.t6.Rev << std::endl
<< "DspType " << pd.t6.DspType << std::endl
<< "IsDacPresent " << pd.t6.IsDacPresent << std::endl
<< "Quartz " << pd.t6.Quartz << std::endl;
диод на тыльной стороне корпуса моргает о приеме/передаче. Далее, после вызова функций ULONG status = pI->InitStartLDevice (); //L_STREAM_ADC);
std::cout << status << " <-> " << GetLastError() << std::endl;
if (status != L_SUCCESS)
std::cout << "status: " << status << std::endl;
HANDLE hThread = CreateThread (0, 0x2000, ServiceThread, 0, 0, & tid);
// Запускаем сбор в драйвере
status = pI->StartLDevice ();//L_STREAM_ADC);
он горит зеленым и больше не моргает, т.е. можно сказать, что прием/передача больше не идет, спасибо
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
По 0 сбросил параметры, как вы советовали - результат тот же, сбора нет, диод не моргает
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
Я проверил под win7 x32 если в примере L7XX.TST обнулить как я написал и запускать с прошивкой e2010m, то у меня работает. Если не обнулять, то стоит в 0.
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
Скомпилировал 32 битный пример и запустил его на 64 битной машине - работает, данные собирает, спасибо
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
64 битный на 64 битной не работает?
|
|
- Участник
- Здесь с 24.10.2014
- Сообщений: 26
|
Re: e2010b feat InitStartLDevice
Вместе с библиотекой я получил уже скомпилированный 64-битный пример (файл - l7xx.tst/release_amd64/client64.exe). Когда я его запускаю, сбора данных не происходит, файлы data.dat и data1.dat, расположенные в этой папке - пустые. Более подробно симптомы описаны в сообщении #8 этой ветки.
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: e2010b feat InitStartLDevice
|