Добрый день!
Никак не получается запустить асинхронное считывание данных в LabVIEW 8.5 на карточке E14-440. До этого не было необходимости в длительном непрерывном считывании данных с карты, поэтому использовал синхронный режим - все работало нормально.
Сейчас пытаюсь составить очередь запросов, но не удается отловить системное событие по завершению считывания очередной порции данных.
Вот есть два CINa (в MS Visual C++ 6.0)
1. CIN MgErr CINRun(uInt32 *ErrCode, uInt32 *Instance, uInt32 *Length, uInt32 *ChannelN, read_pars *rp, TD1Hdl Data)
{
IO_REQUEST_LUSBAPI IoReq[2];
DWORD DataStep;
int i;
if(*ErrCode!=0) return noErr;
DataStep = (*Length)*(*ChannelN);
NumericArrayResize(iW, 1L, (UHandle*)&Data, 2*DataStep);
(*Data)->dimSize = 2*DataStep;
rp->hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
rp->hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
memset(&(rp->ReadOv1), 0, sizeof(OVERLAPPED));
memset(&(rp->ReadOv2), 0, sizeof(OVERLAPPED));
rp->ReadOv1.hEvent = rp->hEvent1;
rp->ReadOv2.hEvent = rp->hEvent2;
for(i = 0x0; i < 0x2; i++) {
IoReq[i].Buffer = (*Data)->value + i*DataStep;
IoReq[i].NumberOfWordsToPass = DataStep;
IoReq[i].NumberOfWordsPassed = 0x0;
IoReq[i].Overlapped = (i == 0x0) ? &(rp->ReadOv1) : &(rp->ReadOv2);
IoReq[i].TimeOut = 1000;
};
rp->RequestNumber = 0x0;
rp->NumberOfWordsToPass = DataStep;
if(!((ILE440*)(*Instance))->STOP_ADC()) {*ErrCode = STOP_ADC_ERROR; return noErr;};
if(!((ILE440*)(*Instance))->ReadData(&IoReq[0])) {*ErrCode = READ_ERROR; return noErr;};;
if(!((ILE440*)(*Instance))->START_ADC()) {*ErrCode = START_ADC_ERROR; return noErr;};
if(!((ILE440*)(*Instance))->ReadData(&IoReq[1])) {*ErrCode = STOP_ADC_ERROR; return noErr;};
return noErr;
}
2. CIN MgErr CINRun(uInt32 *ErrCode, uInt32 *Instance, TD1Hdl Data, read_pars *rp, uInt8 *ready)
{
IO_REQUEST_LUSBAPI IoReq;
HANDLE Module;
if(*ErrCode!=0) return noErr;
*ready = 0;
Module = ((ILE440*)(*Instance))->GetModuleHandle();
if(WaitForSingleObject(rp->ReadOv1.hEvent, 10000) == WAIT_TIMEOUT) *ready = 1;
/*if(GetOverlappedResult(Module, &(rp->ReadOv1), &(rp->NumberOfWordsPassed), FALSE)) *ready = 1; */
return noErr;
}
Первый инициализирует считывание данных, а второй запускается для проверки завершенности очередного считывания (убрал дополнительную обвязку). Так вот при запуске втрого CIN всегда возращается таймаут (параметр ready=1). В случае, когда пытаюсь в цикле опрашивать состояние запроса через GetverlappedResult() событие также не отлавиливается (параметр ready=0). При этом данные из модуля в буфер забираются нормально. В чем может быть дело? Как можно побороть подобное поведение?
P.S. Заметил, что при вызове функции ReadData изменяются поля структуры OVERLAPPED, в частности в поле Internal устанавливается значение 259. Если же делать совсем короткий запрос (исполняется быстрее, чем задержка между вызовом ADC_START() и последующей ReadData()) в поле Internal = 0, а в InternalHigh - NumberOfBytesToPass.
Это нормальное поведение?
P.P.S. Пример на Visual C++ с асинхронным вводом 80 блоков работает нормально.