Электронные технологии и метрологические системы Главная Форум Поиск Карта сайта Написать
Электронные технологии и метрологические системы   
Тел./факс: (495) 228-01-11 (многоканальный); E-mail: info@zetms.ru   
Электронные технологии и метрологические системы ZETLab
 
 Главная 
 Продукция 
 Поддержка 
 Предприятие 
 Прайс лист 
 Контакты 
 Карта сайта 
Тематические статьи
Области применения
Программирование
Наши публикации
Курсы и семинары
Форум
Полезные ссылки
FAQ
Наш алфавит
Удалённое управление анализатором спектра


Online-консультанты
388828835 - Мария
627723417 - Никита
397652821 - Елена

Приглашаем на курсы обучения (20-22 сентября 2011 года)

Форум

Скидка ВУЗам!

Доставка по всему миру!

Удалённое управление прибором.

Каталог продукции.

Запрос звонка

Наш телефон

Наш мобильный телефон

Наш факс


E:mail

Анализатор спектра a17-u8. Срок поставки 2 недели.

Анализатор спектра a17-u2 с ноутбуком.








Главная / Поддержка / Программирование Версия для печати Версия для печати

Преобразование двоичного файла в текстовый


Нам часто задают вопрос: "Как можно преобразовать данные, записанные программой "Регистратор", в числа, пригодные для последующей постобработки?"

Для начала необходимо сказать, что программа "Регистратор" записывает временные реализации сигналов в двоичные файлы на жесткий диск ПК в двоично-дополнительном коде. Для воспроизведения завписанных таким образом сигналов используется программа "Проигрыватель". Когда запускается программа "Проигрыватель", все программы из состава ZETLab переходят в режим ожидания воспроизведения сигналов. При включении проигрывания все программы обрабатывают воспроизводимые сигналы по заложенным в ним алгоритмам, т.е. программа "Узкополосный спектральный анализ" производит обработку сигналов с применением преобразования Фурье, программа "Многоканальный осциллограф" отображает форму сигналов, программа "Вольтметр переменного тока" рассчитывает среднеквадратическое и пиковое значение сигнала и т.д.

Таким образом, пользователю предоставляются широкие возможности по постобработке записанных сигналов.

Но что делать, если хочется (или необходимо) обработать записанные сигналы с применением программ постобработки других фирм-производителей? И что, если эти другие программы "не понимают" двоичные файлы, а понимают только текстовые? Для преобразования двоичных файлов в текстовые в среде ZETLab имеется программа "Конвертер файлов", которая по-умолчанию преобразует двоичные ana/anp-файлы в текстовые dtn-файлы.

Приведённый ниже исходный код на Microsoft Visual C++ преобразует исходный бинарный файл “c:\1.ana” и его заголовок “c:\1.anp” в текстовый файл “c:\1.dat”.

Вот он:

FILE *infile;           // Указатель на исходный двоичный файл

FILE *outfile;          // Указатель на результирующий текстовый файл

float fdata;            // Данные

int   idata;

short sdata;  

double ABSVOLT = 1;     //вес младшего разряда АЦП в вольтах

double GAIN = 1;        //усиление

double SENSE = 1;       //чувствительность датчика

double AMPL = 1;        //предусиление

double DC = 0;          //постоянная составляющая  

int format = 0;

const int size = 100;

char buf[size]= {0};  

//определяем формат файла

infile = fopen("c:\\1.anp", "r");              // Открываем заголовочный файл для чтения

if (infile)

{

    static const char* format_field = "FORMAT";

    static const int format_len = strlen(format_field);

 

    static const char* fields[] = {"ABSVOLT", "GAIN", "SENSE", "AMPL", "DC"}; //названия полей

    static const int length = sizeof(fields)/sizeof(fields[0]);               //длина служебных массивов

    //длины названий полей

    static const int lengths[length] = {strlen(fields[0]), strlen(fields[1]), strlen(fields[2]), strlen(fields[3]), strlen(fields[4])};        

    double * pVals[length] = {&ABSVOLT, &GAIN, &SENSE, &AMPL, &DC};  //адреса переменных соответствующих полям

    //ищем строку FORMAT

    //а также параметры преобразований

    while (!feof(infile) && fgets(buf, size, infile))

    {

        if (0 == strncmp(format_field, buf, format_len))

        {//определяем формат

            char* p = buf+format_len;

            while(isspace(*p))

                ++p;

            if ('f'==*p)

                format=1; //float

            else if ('i'==*p)

            {

                if ('2'==p[1])

                    format = 2; //int

                else

                    format = 3; //short

            }

            continue;

        }

        for (int i = 0; i < length; ++i)

        {//ищем другие параметры

            if (0 == strncmp(fields[i], buf, lengths[i]))

            {

                sscanf(buf+lengths[i], "%f", pVals[i]);

                break;

            }

        }

    }

    //проверяем 0 в знаменателе преобразования

    if (0 == GAIN)

        GAIN = 1;

    if (0 == SENSE)

        SENSE = 1;

    if (0 == AMPL)

        AMPL = 1;

    fclose(infile);

}

double multiplier = ABSVOLT/GAIN/SENSE/AMPL;  //вычисляем коэффициент

infile = fopen("c:\\1.ana", "rb");              // Открываем двоичный файл для чтения

outfile = fopen("c:\\1.dat", "wt");             // Открываем текстовый файл для записи

if ((NULL != infile) && (NULL != outfile))      // Если файлы открылись без ошибок...

{

    while (!feof(infile))                       // Пока не конец файла...

    {

        switch(format)

        {

        case 1:

            fread(&fdata, sizeof(fdata), 1, infile); // Читаем данные из двоичного файла как float

            fprintf(outfile, "%f\n", fdata+DC);         // и записываем их в текстовый

            break;

        case 2:

            fread(&idata, sizeof(idata), 1, infile); // Читаем данные из двоичного файла как целое

            fprintf(outfile, "%d\n", idata*multiplier+DC); // и записываем их в текстовый

            break;

        case 3:

            fread(&sdata, sizeof(sdata), 1, infile); // Читаем данные из двоичного файла как целое

            fprintf(outfile, "%d\n", sdata*multiplier+DC); // и записываем их в текстовый

            break;

        }

    }

    fclose(infile);                             // Закрываем двоичный файл

    fclose(outfile);                            // Закрываем текстовый файл

}