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

Плата LCARD E502. Правильная запись данных во внешний файл

Вы не вошли.

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

ssn73
05.11.2020 13:36:58
#1

Гость

Плата LCARD E502. Правильная запись данных во внешний файл

Добрый день.
Использую в работе плату LCARD E502, пишу свою обработку сигналов (обратное рассеяние звука).
Разобрался с примером на Delphi, который идет с платой, пример работает, все хорошо, на основе него разрабатываю свой функционал.
Беспокоит следующий момент.
Планирую вставить запись в файл оцифрованных данных.
Подскажите пожалуйста, как поступит плата, если идет оцифровка, я в цикле буду сбрасывать на диск оцифрованные данные, и вдруг запись затупит, как понимаю, внутренний буфер платы переполнится, и по новой будет данные перезаписывать?
Т.е. планирую в коде примера (который шел с платой, см. ниже) добавить запись в свой файл считанных данных, но переживаю, что запись на диск все-таки не такая быстрая операция, и буфер внутренний платы может переполниться...
Насколько верно в этом цикле сразу писать данные на диск, или правильнее, копировать себе этот буфер, и в отдельном потоке писать данные на диск.

Если где-то некомпетентен, просьба, не пинайте, новая для меня тема, разбираюсь с ней, помогите....

Вот пример кода, который идет с платой. Именно в этом цикле и планирую писать в файл..., насколько это верно при работе с этой платой.
Тупо вставил запись пробную запись в текстовый файл, вроде все пишет, успевает (см. выделение).
Как понял, размер буфера 8МБ, т.е. const RECV_BUF_SIZE = 8*1024*1024;

procedure TX502_ProcessThread.Execute;
  var
    stoperr, rcv_size, ssn_i : LongInt;
    rcv_buf : array of LongWord;

    f : TextFile;
    ssn_CCount : LongWord;
  begin
    AssignFile(f, 'Record.txt');
    ReWrite(f);

    setlength(rcv_buf, RECV_BUF_SIZE);
    // запускаем синхронные потоки
    err:= X502_StreamsStart(hnd);
    if err = X502_ERR_OK then
    begin
      { выполняем прием пока не произойдет ошибка или
        не будет запроса на останов от основного приложения }

       err := X502_GetLChannelCount(hnd, ssn_CCount);

      while not stop and (err = X502_ERR_OK) do
      begin
        //принимаем данные синхронного ввода
        rcv_size := X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
        // значение меньше нуля означает ошибку...
        if rcv_size < 0 then
            err := rcv_size
        else if rcv_size>0 then
        begin
          //если больше нуля - значит приняли новые данные
          dinSize:=RECV_BUF_SIZE;
          adcSize:=RECV_BUF_SIZE;
          { получаем номер лог. какнала, соответствующий первому
            отсчету АЦП, так как до этого могли обработать
            некратное количество кадров }
          err:=X502_GetNextExpectedLchNum(hnd, firstLch);
          if err = X502_ERR_OK then
          begin
            { разбираем данные на синхронный ввод и отсчеты АЦП и
              переводим АЦП в Вольты }
            err := X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
                                    adcData, adcSize, dinData, dinSize);

            writeln(f, 'Размер буфера ' + IntToStr(adcSize) + ' канал ' + IntToStr(firstLch));
            for ssn_i := 0 to adcSize do
              writeln(f, FloatToStr(adcData[ssn_i]));

            if err = X502_ERR_OK then
            begin
              // обновляем значения элементов управления
              Synchronize(updateData);
            end;
          end;
        end
      end;

ssn73
05.11.2020 14:04:08
#2

Гость

Re: Плата LCARD E502. Правильная запись данных во внешний файл

Дополнение. Использую Windows 10, карта подключена через USB.
Как понимаю, считывает данные с буфера именно метод rcv_size := X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
Как понять, что я все скинул на диск и не переполнился внутренний буфер, т.е. чтобы не потерять данные.
Как корректно реализовать запись буфера на диск?

05.11.2020 17:19:17
#3

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

Re: Плата LCARD E502. Правильная запись данных во внешний файл

Здравствуйте.
Если буфер переполнится, то Вы узнаете об этом, т.к. функция X502_ProcessData() вернет ошибку X502_ERR_STREAM_OVERFLOW. При этом когда буфер переполняется, то дальнейшие слова откидываются, т.к. старые не перезатираются, и будут откидываться, пока не начнете вычитывать данные снова, при этом место разрыва помечается специальным словом, по которому ProcessData и узфнает, что в обрабатываемом блоке был разрыв. Т.е. если проверяется результат ProcessData, то факт переполнения всегда будет обнаружен.

Далее, сама библиотека для e502 устроена так, что она выделяет буфер внутри себя, в который постоянно вычитывает из модуля данные, если есть место в этом промежуточном буфере. А уже Recv вычитывает из него, а не непосредственно из платы. Этот буфер достаточно большой (по умолчанию на 3 секунды, но при желании можно и явно установить до запуска сбора с помощью X502_SetStreamBufSize()), в общем при штатной работе машины этого должно быть более чем достаточно, поэтому в этом случае в принципе делать еще один поток кроме приема не обязательно, т.к. буферизация уже сделана внутри библиотеки.

Контакты

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

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

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

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