Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54

Чтение данных из файла и их передача через порт компьютера

21.05.2017, 10:15. Показов 8307. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть задача: в текстовый файл в реальном времени пишется поток данных (углы наклона прибора в градусах). Необходимо считывать данные из этого файла в реальном времени и передавать их через COM- порт, с дальнейшей передачей данных на ЦАП и получения эквивалентного напряжения (из файла считалось, например, 5 градусов, дальше эти 5 градусов ушли через порт, там преобразовались в напряжение).

Собственно вопросы:
1)Как это реализовать и что для этого надо?
2)Можно ли делать чтение с определенной строчки и до конца?

Добавлено через 16 минут
Либо вместо COM использовать USB
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2017, 10:15
Ответы с готовыми решениями:

Чтение/передача данных через USB порт
Задача такова: есть внешний микроконтроллер (Arduino) который связан с ПК ч/з USB (некоторый COM-порт) и вот нужно принимать инфу или её...

Чтение данных через COM порт
Имеется устройство, панель кнопок, связанная с компом через RS-232 т.е. COM порт. Хочу сделать прогу, которая отображала бы нажатие...

Передача данных через Com порт
Добрый день форумчане! Мне с помощью программы "free-serial-port-monitor" удалось считал данные, которыми через com порт обменивались...

67
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.05.2017, 20:16
Студворк — интернет-сервис помощи студентам
Ну сделай сразу %f в sscanf() и будет float.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
23.05.2017, 12:55  [ТС]
Попытался через std::strtof(); сделать, говорит E2316 'strtof' is not a member of 'std'.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    FILE *file;
    char pitch[16], roll[16], headingt[16], headingm[16], Mach[16], VVI[16], Gload_n[16], Gload_a[16], Gload_s[16], alpha[16], beta[16], hpath[16], vpath[16], slip[16];
    char s[224];
    file=fopen("Data.txt","r");
    float Mach_f;
 
    while(1)
    {
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s |", Mach, VVI, Gload_n, Gload_a, Gload_s, pitch, roll, headingt, headingm, alpha, beta, hpath, vpath, slip);
            Mach_f = std::strtof(Mach);
            printf("%f\n", Mach_f);
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
 
        fclose(file);
        system("pause");
    return 0;
}
Цитата Сообщение от nmcf Посмотреть сообщение
Ну сделай сразу %f в sscanf() и будет float.
Если я так делаю, то в printf(); надо тоже ставить %f. И когда идет чтение файла, то я вместо данных получаю 0.00000. Что я делаю не так?

Добавлено через 14 минут
P.S.: Пользуюсь Borland Builder C++ 6 Enterprise Edition

Добавлено через 1 час 7 минут
Я кажется догадываюсь почему такая ошибка - мой билдер 2002 года, а stof/strtof в с++ 11 стандарте.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.05.2017, 13:40
Цитата Сообщение от Jank Посмотреть сообщение
Если я так делаю, то в printf(); надо тоже ставить %f. И когда идет чтение файла, то я вместо данных получаю 0.00000. Что я делаю не так?
Значит не правильно делаешь. Показывай.

Добавлено через 1 минуту
Цитата Сообщение от Jank Посмотреть сообщение
Пользуюсь Borland Builder C++ 6 Enterprise Edition
Зачем? Он давно устарел.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
23.05.2017, 16:28  [ТС]
Вот так пытаюсь:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
 
using namespace std;
 
int main()
{
    FILE *file;
    float pitch[16], roll[16], headingt[16], headingm[16], Mach[16], VVI[16], Gload_n[16], Gload_a[16], Gload_s[16], alpha[16], beta[16], hpath[16], vpath[16], slip[16];
    char s[224];
    file=fopen("Data.txt","r");
    float Mach_f;
 
    while(1)
    {
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", Mach, VVI, Gload_n, Gload_a, Gload_s, pitch, roll, headingt, headingm, alpha, beta, hpath, vpath, slip);
            /*Mach_f = std::stof(Mach);*/
            printf("%f\n", Mach);
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
 
        fclose(file);
        system("pause");
    return 0;
}

Цитата Сообщение от nmcf Посмотреть сообщение
Сообщение от Jank
Пользуюсь Borland Builder C++ 6 Enterprise Edition
Зачем? Он давно устарел.
Поставил C++ 10 Builder Seattle.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.05.2017, 17:37
Цитата Сообщение от Jank Посмотреть сообщение
Вот так пытаюсь:
Либо pitch и прочие не должны быть массивами, либо надо вводить индексацию в sscanf() - &pitch[i], что усложнит программу.
Ты планируй на пару шагов дальше. Как отправка будет реализована? Нужны ли эти массивы? Или хватит одного набора? Может какой-то контейнер прикрутить типа queue?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
23.05.2017, 17:47  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Либо pitch и прочие не должны быть массивами, либо надо вводить индексацию в sscanf() - &pitch[i], что усложнит программу.
Ты планируй на пару шагов дальше. Как отправка будет реализована? Нужны ли эти массивы? Или хватит одного набора? Может какой-то контейнер прикрутить типа queue?
А как мне тогда считывать файл, если не в массивы? Мне проще тогда массив преобразовать в переменную типа char, потом перевернуть char в float. С обычной переменной должно сработать.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.05.2017, 17:58
Массив-то зачем? Ну вот ты считал строку и пересылаешь дальше, потом перезаписываешь числами из новой строки и т. д.
C++
1
2
3
float Mach, //...
 
sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, //...
Точнее излагай. Есть какая-то необходимость хранить массивами? Файл растёт бесконечно, тогда и массив бесконечно должен расти или что?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
23.05.2017, 18:04  [ТС]
Нет, массив хранить не надо. Просто я так реализовал хранение числа. Вообще надо бы от него избавиться.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.05.2017, 18:08
Ну вот и используй просто набор переменных float.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
23.05.2017, 18:31  [ТС]
Сейчас попробую

Добавлено через 12 минут
Отлично, работает!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
 
using namespace std;
 
int main()
{
    FILE *file;
    float pitch, roll, headingt, headingm, Mach, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip;
    char s[224];
    file=fopen("Data.txt","r");
 
    while(1)
    {
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            printf("%f\n", pitch);
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
 
        fclose(file);
        system("pause");
    return 0;
}
Добавлено через 3 минуты
Теперь объясню про передачу данных. Мне нужно, чтобы моя программа после принятия данных смогла вывести их через порт компьютера. COM'a у меня нету и на другой машине его 90% не будет. Отсюда вывод - надо выводить по USB. Мне надо, чтобы мои данные, например -109.98625, вышли с компьютера в бинарном виде, чтобы их можно было подать на ЦАП и дальше я уже буду работать с напряжением. Причем, выходных данных будет 2 потока, надо чтобы они шли параллельно и одновременно. И еще такой момент: нужно будет прикрутить коэффициент, чтобы управлять величиной, но это позже. С выводом данных я ничего не знаю, скажите с чего начать - буду разбираться.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.05.2017, 19:11
COM есть даже на новых платах, только панель со шлейфом нужна.
Как по USB? Через переходник? Тогда всё равно в системе будет COM-порт.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
24.05.2017, 14:51  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
COM есть даже на новых платах, только панель со шлейфом нужна.
Как по USB? Через переходник? Тогда всё равно в системе будет COM-порт.
Расскажите с чего начать, какую литературу прочесть, буду разбираться. И еще, хочу из консоли перейти в форму, чтобы и красиво и удобно было. Пытался сделать, при забивании этого кода в кнопку, программа считывает файл и повисает намертво. Как правильно сделать?

Добавлено через 38 минут
И такой момент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while(1)
    {
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            Alpha = alpha/k;
            printf("%f\n", Alpha);
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
Операция деления не происходит.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2017, 14:55
Цитата Сообщение от Jank Посмотреть сообщение
Как правильно сделать?
Ну там надо либо в отдельном потоке, либо по таймеру считывать запись. И должен быть культурный способ завершения - я уже говорил об этом.
Qt бери. Там есть и формы и класс QSerialPort.

Добавлено через 1 минуту
Цитата Сообщение от Jank Посмотреть сообщение
Операция деления не происходит.
Что выводит?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
24.05.2017, 15:10  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И должен быть культурный способ завершения - я уже говорил об этом.
Не понимаю, что вы имеете в виду) вместо while(1) сделать while(!feof)?
Цитата Сообщение от nmcf Посмотреть сообщение
Что выводит?
тоже самое число, как будто программа не видит деление. Например: alpha=1.390833, k=1.390833, при делении должна получиться единица, однако получается 1.390833....
C++
1
2
3
4
5
6
7
int main()
{
    FILE *file;
    float pitch, roll, headingt, headingm, Mach, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip;
    float k = 1.390833;
    float Alpha = 0;
.....
Добавлено через 3 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Ну там надо либо в отдельном потоке, либо по таймеру считывать запись.
Мне надо, чтобы данные в файл записались и в этот же момент ушли на порт, никаких задержек, т.е. таймер отпадает. Отображение в консоли остается чисто для наблюдения.

Добавлено через 3 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
COM есть даже на новых платах, только панель со шлейфом нужна.
В HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SE RIALCOMM лежит \Device\Serial0|REG_SZ|COM1 - значит ком на плате есть, только вот разъема на ней я не нашел, может не так смотрю...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2017, 16:20
Цитата Сообщение от Jank Посмотреть сообщение
Не понимаю, что вы имеете в виду) вместо while(1) сделать while(!feof)?
Нет, прекращать, если клавиша нажата, например.
Цитата Сообщение от Jank Посмотреть сообщение
Мне надо, чтобы данные в файл записались и в этот же момент ушли на порт, никаких задержек, т.е. таймер отпадает.
Интервал таймера в миллисекундах задаётся. Тебе хватит.
Цитата Сообщение от Jank Посмотреть сообщение
значит ком на плате есть, только вот разъема на ней я не нашел, может не так смотрю
Руководство найди. Ну и панель нужна.
Цитата Сообщение от Jank Посмотреть сообщение
alpha=1.390833, k=1.390833, при делении должна получиться единица, однако получается 1.390833
Проверь значение alpha.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
24.05.2017, 17:26  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Нет, прекращать, если клавиша нажата, например.
Зачем? Я просто не могу понять - чем плохо завершение, когда заканчивается симуляция, в связи с этим заканчивается дополнение документа новыми данными и while(!feof) закончится, закроется чтение документа, программа остановится.
Цитата Сообщение от Jank Посмотреть сообщение
И еще, хочу из консоли перейти в форму, чтобы и красиво и удобно было. Пытался сделать, при забивании этого кода в кнопку, программа считывает файл и повисает намертво. Как правильно сделать?
Вот тут еще подскажите. Как убрать повисание программы при чтении потока?

Добавлено через 6 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Проверь значение alpha.
Заработало, убрал float Alpha = 0, заменил на float Alpha1; Может глюк какой...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2017, 17:36
Цитата Сообщение от Jank Посмотреть сообщение
чем плохо завершение, когда заканчивается симуляция, в связи с этим заканчивается дополнение документа новыми данными и while(!feof)
Тем, что если читающая программа обгонит записывающую, то будет завершение.
Цитата Сообщение от Jank Посмотреть сообщение
Вот тут еще подскажите. Как убрать повисание программы при чтении потока?
Я же описал 2 варианта: таймер и выполнение в отдельном потоке. С таймера начни. Это проще реализовать.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
24.05.2017, 17:49  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Я же описал 2 варианта: таймер и выполнение в отдельном потоке. С таймера начни. Это проще реализовать.
Просто я не могу понять, в чем причина - в консольном приложении все работает, в форме нет...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2017, 19:25
Программу показывай. В какой форме?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
25.05.2017, 12:36  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Программу показывай. В какой форме?
VCL Forms Application форма. На ней Edit1 и Button1. В кнопку записан мой код, который считывает и сразу выводит данные в Edit1. Пробовал без вывода в Edit1, только чтение по нажатию кнопки - все равно виснет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    FILE *file;
    float pitch, roll, headingt, headingm, Mach, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip;
    char s[224];
    file=fopen("Data.txt","r");
 
    while(!feof(file))
    {
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            /*Ny_data->Text = (FloatToStr(Gload_n));
            M_data->Text = (FloatToStr(Mach));
            Roll_data->Lines->Add(FloatToStr(roll));
            Pitch_data->Lines->Add(FloatToStr(pitch));
            Heading_data->Lines->Add(FloatToStr(headingt));
            Slip_data->Lines->Add(FloatToStr(slip));*/
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
 
        fclose(file);
}
Оно не проблемно работать с консолью, просто не хочется иметь число окошек = числу выводимых параметров и нужно иметь кнопку, чтобы отправлять данные на порт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2017, 12:36
Помогаю со студенческими работами здесь

Передача данных через ИК порт
Нужно организовать систему передачи данных через инфракрасный на ассемблере. ИК должен подключаться к ком порту. Подскажите пожалуйста,...

Получение и передача данных через COM порт
Добрый день Мне кажется, я изобретаю велосипед и должно быть полно примеров такого кода. Но ничего найти не удалось. Суть:...

Передача и приём данных через COM порт
Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus rtu. Установил библиотеки ком порта...

Передача данных через последовательный порт
Ребят, всем добрый вечер! Предстоит следующая задача: нужно реализовать, например - в отдельном классе, функции для передачи данных через...

Передача и приём данных через COM-порт
Добрый день! Передо мной поставили задачу написать программу для работы с адаптером OBD2 Elm327 через виртуальный COM-порт. Пробую пока...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru