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


Поле NumberOfWordsPassed

Вы не вошли.

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

Алексей
03.04.2012 09:05:20
#1

Гость

Поле NumberOfWordsPassed

Здравствуйте.
Пишу на С++ под модуль E20-10. Реализую асинхронное считывание. По логике асинхронного запроса ReadData, как я понимаю, должно осуществиться считывание из модуля не более NumberOfWordsToPass (структура IO_REQUEST_LUSBAPI) данных, но по факту их может оказаться меньше. О количестве считанных данных я должен узнавать, считывая NumberOfWordsPassed. Было бы логично мне передовать далее в графику и на обработку именно NumberOfWordsPassed данных. Но данное поле всегда возвращает 0, хотя данные явно считываются. Мне кажется было бы логично, чтобы при нормально считывании NumberOfWordsPassed равнялось NumberOfWordsToPass. Вопрос - чего я не понимаю?
Заранее благодарен,
Алексей Денисов

03.04.2012 10:32:22
#2

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

Re: Поле NumberOfWordsPassed

По логике именно для асинхронного запроса ReadData() в параметре NumberOfWordsPassed может вернутся 0. Чтобы узнать актуальное значение прочитанных данных можно воспользоваться WinAPI функцией GetOverlappedResult(). Подробнее смотри:
1. п.4.5.6. "Получение данных АЦП" руководства программиста (http://www.lcard.ru/download/e2010_prog … _guide.pdf);
2. штатные примеры программирования.

Алексей
04.04.2012 15:24:48
#3

Гость

Re: Поле NumberOfWordsPassed

Здравствуйте, Сергей.
Всё, что Вы мне предложили я смотрел. Но в примерах в асинхронном режиме данное поле не используется. А фраза "По логике именно для асинхронного запроса ReadData() в параметре NumberOfWordsPassed может вернутся 0" фактически всё, что написано о данном поле в асинхронном режиме. К сожалению, из неё я не могу понять как зачем это поле нужно  в асинхр. режиме. Зачем мне пользоваться GetOverlappedResult() для получения актуального значения прочитанных данных, если в описании заявлено "В данном параметре возвращается то кол-во отсчётов АЦП, которое данная функция реально получила из модуля".
Было бы интересно узнать в чем разница.
Алексей Денисов

04.04.2012 19:03:36
#4

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

Re: Поле NumberOfWordsPassed

"...К сожалению, из неё я не могу понять как зачем это поле нужно в асинхр. режиме..."
При использовании асинхронного режима это поле не несёт никакой информации - это особенность рассматриваемого режима. При этом с уверенностью можно говорить о том, что ПОСЛЕ успешного завершения асинхронного запроса в массиве Buffer будет находиться ровно NumberOfWordsToPass отсчётов АЦП. Момент завершения асинхронного запроса можно отслеживать, например, обычными WinAPI функциями типа WaitForSingleObject(), GetOverlappedResult() или HasOverlappedIoCompleted().
"...В данном параметре возвращается то кол-во отсчётов АЦП, которое данная функция реально получила из модуля..."
Это общий смысл. А далее по тексту руководства программиста конкретизируется особенность параметра NumberOfWordsPassed именно для асинхронного режима.

05.04.2012 14:38:09
#5

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

Re: Поле NumberOfWordsPassed

Алексей, смысл этого параметра соответствует логике работы с асихронным (overlapped) вводом/выводом в WinAPI, т.е. в отношении него действют те же соображения, что и для параметров lpNumberOfBytesRead / lpNumberOfBytesWritten функций ReadFile() и WriteFile() соответственно.

По сути метод ReadData() сводится к вызову  ReadFile() с соответствующими параметрами.

Получить значение реально переданных данных для *асинхронного* запроса, разумеется, невозможно в момент вызова функции, инициирующей этот запрос, т.к. он еще не выполнился и этой информации просто не существует.

Алгоритм примерно такой:
"Вася, иди собирать грибы" -- "Иду" (в сенях хлопает дверь: ушел); величина "количество собранных грибов" еще неизвестна, можно считать за 0.
ReadFile() --> FALSE, GetLastError() == ERROR_IO_PENDING, NumberOfBytesRead не имеет смысла

(подождать, пока дверь хлопнет еще раз)
WaitForSingleObject()

"Вася, ты уже вернулся?" - "Да, и собрал 8192 гриба".
GetOverlappedResult() -> TRUE, получение NumberOfBytesTransferred

Алексей
05.04.2012 16:44:46
#6

Гость

Re: Поле NumberOfWordsPassed

Спасибо за разъяснение. Хотя мог бы сам догадаться. И для таких олухов как я, лучше бы в описании уточнить, что параметр нет смысла использовать в асинхронном режиме.
С уважением,
Алексей Денисов

Алексей
09.04.2012 18:59:12
#7

Гость

Re: Поле NumberOfWordsPassed

CHANNELS_QUANTITY :WORD = $9;
AdcBuffer:array[0..$9] of  SHORT;
    ap.ControlTable[0] := $0  ;
    ap.ControlTable[1] := $1  ;
    ap.ControlTable[2] := $2  ;
    ap.ControlTable[3] := $3  ;
    ap.ControlTable[0] := $4  ;
    ap.ControlTable[1] := $5  ;
    ap.ControlTable[2] := $6  ;
    ap.ControlTable[3] := $7  ;
    ap.ControlTable[0] := $8  ;
    ap.ControlTable[1] := $9  ;
ADC(pin:word):integer;
begin
         pModule.ADC_KADR(@AdcBuffer);
         adc_fir:=AdcBuffer[pin];
result:=adc_fir;
end;/////////////вкратце написал....

почему-то только 4 канала работают, а остальные нет, что неправильно делаю?

09.04.2012 19:08:53
#8

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

Re: Поле NumberOfWordsPassed

Вас не смущают индексы при заполнении ap.ControlTable[]? smile

Алексей
09.04.2012 19:12:02
#9

Гость

Re: Поле NumberOfWordsPassed

CHANNELS_QUANTITY :WORD = $9;
  AdcBuffer:array[0..$9] of  SHORT;
    ap.ControlTable[0] := $0  ;
    ap.ControlTable[1] := $1  ;
    ap.ControlTable[2] := $2  ;
    ap.ControlTable[3] := $3  ;
    ap.ControlTable[4] := $4  ;
    ap.ControlTable[5] := $5  ;
    ap.ControlTable[6] := $6  ;
    ap.ControlTable[7] := $7  ;
    ap.ControlTable[8] := $8  ;
    ap.ControlTable[9] := $9  ;
adc(pin:word) :word
begin
  pModule.ADC_KADR(@AdcBuffer);
  result:=AdcBuffer[pin];
end;
нужно включить 10 каналов я правильно делаю?

09.04.2012 19:16:38
#10

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

Re: Поле NumberOfWordsPassed

channels_quantity (10) нужно записать в ap (в соответствующее поле), а не просто в какую-то отвлеченную переменную. Модулю ведь тоже надо это знать.
Потом надо передать ap в функцию set_adc_pars (заполнив при необходимости остальные поля, см. руководство).
После этого уже можно ADC_KADR.

Контакты

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

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

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

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