|
|
Ввод данных с помощью FIFO
Можно ли организовать ввод данных при помощи FIFO без привлечения прерываний? Просто если судить по руководству то можно с помощью GET_FAST_SOFT_DATA.
Но при попытке выполнить пример приведенный в описании ничего не получается. Создается такое ощущение что эта функция не ждет накопления полубуфера данными и выдает не понятно какие значения.Вот и интересно , это я должен проверять заполненость буфера или функция должна делать это сама и я просто не правильно с ней работаю ?
Сам пример:
CONFIG_FIFO_CC(2,2)
SET_FIFO_SIZE_CC(8192)
LogChannel=CREATE_CHANNEL_LC111(1,0,0)
SOFT_CONFIG_CC(-1,1,LogChannel,Rate)
FAST_SOFT_START_CC()
GET_FAST_SOFT_DATA(Buffer,4096)
FAST_SOFT_STOP_CC() {Кстати это функции нет в lcard_32.dll }
Что здесь не правильно ? и Какого типа должен быть Buffer ? int16 или int32 ?
|
|
|
Re: Ввод данных с помощью FIFO
1. Buffer - надо трактовать как 16-ти битные знаковые числа.
2. FAST_SOFT_STOP_CC = SOFT_STOP_CC
3. А вы вызывали READ_CALIBR_CC и SET_CAIBR_MODE_CC после загрузки крейта?
|
|
|
Re: Ввод данных с помощью FIFO
Да при инициализации я вызываю READ_CALIBR_CC и ставлю SET_CALIBR_MODE_CC(-1)
А вы не подскажите вообще ф-ция GET_FAST_SOFT_DATA сама ожидает накопления полубуфера или надо самому за этим следить ?
|
|
|
Re: Ввод данных с помощью FIFO
|
|
|
Re: Ввод данных с помощью FIFO
Вот фрагмент работающей на моем компьютере программы:
int NCh= 16;
WORD Channels[32];
READ_CALIBR_CC();
SET_CALIBR_MODE_CC(-1);
for (j=0; j<Nch; j++) {
Channels[j*2]=Slot;
Channels[j*2+1]=CREATE_CHANNEL_LC111(j, 0, 0);
};
CONFIG_FIFO_CC(2, 2);
SET_FIFO_SIZE_CC(8192);
SOFT_CONFIG_CC(-1, Nch, Channels, 100*Nch);
while(!kbhit()) {
FAST_SOFT_START_CC();
while(!kbhit()) {
GET_FAST_SOFT_DATA(Buffer, 4096);
DrawBuffer(Buffer, Nch, NPoint);
};
FAST_SOFT_STOP_CC();
}
|
|
|
Re: Ввод данных с помощью FIFO
Вот пример моей программы :
CONFIG_FIFO_CC(2,2);
SET_FIFO_SIZE_CC(8192);
SOFT_CONFIG_CC(-1,1,Channel,Rate);
FAST_SOFT_START_CC();
while(sizeofBuffer<NPoint){
GET_FAST_SOFT_DATA(Buffer,4096);
};
SOFT_STOP_CC();
Где sizeofBuffer размер Buffer
После запуска программа возвращает непонятное значение 19532 ... И если судить по времени исполнения то оно не равно NPoint*rate , а существенно меньше....rate я задаю 1000 , NPoint = 16384
Есть ли какие либо ограничения на rate (у Вас в примере rate = 100 это принципиально или нет ?)?
И напишите , пожалуйста , типы перемменных с какими Вы работаете(к примеру, типы Channels и Buffer)
Заранее спасибо.
|
|
|
Re: Ввод данных с помощью FIFO
Често говоря, ваша программа выглядит неработоспособной (как вычисляется sizeofBuffer ? - если это sizof(Buffer), то это число не более 4 !, и где это значение обновляется ?).
В ответе от 18.12.01 13:39 сказано, что Channels - это: WORD Channels[32];
А в ответе от 18.12.01 12:46 сказано: "Buffer - надо трактовать как 16-ти битные знаковые числа"
Да, и как могла работать конструкция 1)-2), где
1) LogChannel=CREATE_CHANNEL_LC111(1,0,0)
и 2) SOFT_CONFIG_CC(-1,1,LogChannel,Rate)
от 17.12.01 17:16 в Вашем примере? - ведь в SOFT_CONFIG_CC 3-ий параметр - вида WORD *.
Будьте, пожалуйста внимательнее. Думаю, Вам нужно взять за основу пример от 18.12.01 13:39 и попробовать, чтобы от заработал.
Rate может быть и > 100 - это не принципиально.
|
|
|
Re: Ввод данных с помощью FIFO
Ладно я напишу подробнее как выглядит моя программа. Просто я пишу под LabView и не хотелось все подробно рассписывать под Cи
Если вернутся к Си, то она выглядела бы так:
NPoint=16384;
Rate=1000;
READ_CALIBR_CC();
SET_CALIBR_MODE_CC(-1);
Channel[0]=Slot_111;
Channel[1]=CREATE_CHANNEL_LC111(1,0,0);
CONFIG_FIFO_CC(2, 2);
SET_FIFO_SIZE_CC(8192);
SOFT_CONFIG_CC(-1, 1, Channel, Rate);
FAST_SOFT_START_CC();
while(sizeofBuffer<NPoint){
GET_FAST_SOFT_DATA(Buffer,4096);
далее вычисляется размер массива Buffer
(не помню как это делается в Си)
и присваивается переменной sizeofBuffer;
};
SOFT_STOP_CC();
Для Channel и Buffer я ставлю тип int16
Пробовал для Channel uint16(беззнаковое int16) не помогло.После выхода из цикла в Buffer лежит какая то ерунда (19532)...
Может ли это происходить из-за не верной последовательности инициализации ? И если да , то напишите, пожалуйста, в каком порядке тогда нужно производить инициализацию.
Хотя при работе с ф-цией SOFT_CC возращаются правильные значения...
И не могли бы Вы выслать мне пример работы с ф-цией GET_FAST_SOFT_DATA под LabView (конечно при ее наличии)?
Заранее спасибо.
|
|
|
Re: Ввод данных с помощью FIFO
И еще вопрос : Могут ли такие глюки обьясняться старой весрией биоса или длл-ки?
У меня стоит биос под LC-014 lc_014.bio от 30 июля 1999 г. размер 29,2 Кб
и длл-ка lcard_32.dll от 5 марта 1998 г. размер 187 Кб
Заранее спасибо.
|
|
|
Re: Ввод данных с помощью FIFO
Для Lab-View примера нет, есть для BorlandC5.0 ->
См. E-mail
|
|
|
Re: Ввод данных с помощью FIFO
Ваш пример вроде работает , но все равно иногда проскакивают некоторые не понятные значения ...
Я попробовал реализовать этот пример у себя и получилось что после первого считывания полубуфера возвращаются непонятные значения 19532 а уже второе считывание проходит нормально.То есть в полученном массиве первые 4096 элементов неверные а остальные правильные. Не подскажите с чем это может быть связано ?
|
|
|
Re: Ввод данных с помощью FIFO
И еще оказалось что правильность данных зависит от rate, т.е. если Rate маленький (100 и меньше), то не правильно считывается где-то 4000 элементов ,а при больших rate их кол-во увеличивается.
|
|
|
Re: Ввод данных с помощью FIFO
Я такого у себя не вижу, и объяснить пока не могу
|
|
|
Re: Ввод данных с помощью FIFO
Я отослал Вам пример обратно с моими параметрами.
У меня он работает не верно.Интересно как у Вас?
|
|
|
Re: Ввод данных с помощью FIFO
Буду смотреть. Скорее всего, смогу приступить к этому завтра вечером.
|
|
|
Re: Ввод данных с помощью FIFO
Проблема разрешилась, ответ - см. Email
|