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

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

21.05.2017, 10:15. Показов 8289. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru