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

L-502, приём на АЦП

Вы не вошли.

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

10.08.2017 10:43:12
#1

Участник
Здесь с 16.02.2017
Сообщений: 7

L-502, приём на АЦП

Здравствуйте!
Принимаю от L-502 данные с частотой 10 000Гц.
Задаю массив принятый в буфер = 1000, TOUT принимаю равным 100мс.
Как только в потоке принял в буфер нужное количетво, делаю слип на 100мс, и перехожу к построению графика.
НО! вместо ожидаемого массива в 1000 точек, получаю иногда 960 точек.
есл сделать буфер больше допустим 10 000 точек, то могу получать уже не 1000 а аш 1500 точек.
Если увеличить время TOUT до 1с, то вместо 10000 точек получаю опятьже 9960 точек.

программа выглядит так:
{.........
                            thread = new Thread(this.threadFunc);
                            threadRunning = true;
                            thread.Start();
.....}

        private void threadFunc()
        {
            reqStop = false;
            if (adcErr == lpcie.Errs.OK)
            {
                lpcie.Errs StreamErr = hnd.StreamsStart();
                if (StreamErr == lpcie.Errs.OK)
                {
                    while (!reqStop && (StreamErr == lpcie.Errs.OK))
                    {
                        Int32 rcv_size = hnd.Recv(rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
                        if (rcv_size < 0) StreamErr = (lpcie.Errs)rcv_size;
                        if (rcv_size > 0)
                        {
                            dinSize = RECV_BUF_SIZE;
                            adcSize = RECV_BUF_SIZE;
                            firstLch = hnd.NextExpectedLchNum;
                            StreamErr = hnd.ProcessData(rcv_buf, (uint)rcv_size, L502.ProcFlags.VOLT, adcData, ref adcSize, dinData, ref dinSize);
                        }
                        if (StreamErr == lpcie.Errs.OK)
                        {
                            Thread.Sleep(sleepTime);
                            UpdateDataStream();

                        }
                    }
                    lpcie.Errs stop_err = hnd.StreamsStop();
                    if (adcErr == lpcie.Errs.OK)
                        adcErr = stop_err;
                }
            }
            /* завершаем поток */
            finishThread(adcErr);
        }
Впринципе полностью повторил ваш пример, кроме слипа. В вашем примере вы выбираете первое значение из массива.

10.08.2017 10:46:53
#2

Участник
Здесь с 16.02.2017
Сообщений: 7

Re: L-502, приём на АЦП

Или мб всё из-за того что система не реального времени? мб мне необходимо просто постоянно наращивать массив и при этом постоянно делить размерность массива на частоту и таким образом отсчитывать необходимое время?

10.08.2017 10:57:57
#3

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

Re: L-502, приём на АЦП

Да, Windows система не реального времени, вносятся задержки как на вызов системных функций, так и на время передачи данных из платы в ПК и т.п.. Поэтому делать задержки через Sleep() не совсем корректно. Если хотите обрабатывать данные за заданный интервал, то правильнее идти от частоты дискретизации и по нему рассчитать нужное количество отсчетов и делать Recv() на это кол-во с запасом по времени (функция в любом случае вернет управление как наберет нужное кол-во данных, поэтому весь таймаут ждать не будет) обработать, вывести (это если в простейшем случае в одном потоке все, только время обработки должно быть не больше времени прихода данных, за который обрабатываете), далее без всяких Sleep() снова Recv на нужный блок без всяких внешних Sleep, т.к. Recv() сама будет ждать нужное время прихода новых данных.

Контакты

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

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

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

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