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

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

21.05.2017, 10:15. Показов 8285. Ответов 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
21.05.2017, 12:03
А они в конец файла добавляются? Переполнение диска не происходит?
Надо чтобы файл открывался без блокировки разделяемого доступа. Как в torrent-клиентах. Тогда можно считывать параллельно с записью.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 12:53  [ТС]
Запускает программа, виртуально происходят манипуляции, автоматически создается файл с установленным именем и расширением (Data.txt) и просто сверху-вниз пишется колонка до тех пор, пока не остановится программа симуляции.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 13:56
Ну так в чём проблема? Открывай его на чтение и обрабатывай.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 14:38  [ТС]
Проблема в том, что файл выглядит как:

данные1 | данные1 | данные3 | данные4|
1234134 | 1234134 | 1234134 | 1234134 |
1234134 | 1234134 | 1234134 | 1234134 |

Мне нужно: 4 массива, чтобы 1 считывал только 1 колонку, второй только 2 и тд.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 14:42
Считывание идёт строками. А распределять части строки можешь по разным массивам.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 15:09  [ТС]
Еще момент: симуляция может идти сколь угодно долго, соответственно массив не должен быть переполнен. Либо надо перезаписать данные, чтобы старые пропадали, а поверх них заводились новые.

Добавлено через 24 минуты
Использую эту конструкцию:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
#define N 80
 
main () { 
    FILE *file;
    char arr[N];
 
    file = fopen("Data.txt", "r");
 
    while (fgets (arr, N, file) != NULL)
        printf("%s", arr);
 
    printf("\n");
    fclose(file);
}
Тем самым решил проблемы:
1)Кол-во строк не ограничено.
2)Старые данные стираются, поверх пишутся новые.
Остались проблемы:
1)Как вытащить первые 16 символов строки в отдельный массив, как вторые 16 и тд. Колонок 4 шт
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 16:08
И где здесь решение? Ты же в массив не записал. И нужен ли он? Если отправка сразу идёт, то и накапливать больше одного набора незачем. Почему 16 символов? Четыре числа в строке. Ты как их передавать-то хочешь? Текстом, или там какой-то формат?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 16:29  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И где здесь решение? Ты же в массив не записал. И нужен ли он? Если отправка сразу идёт, то и накапливать больше одного набора незачем. Почему 16 символов? Четыре числа в строке. Ты как их передавать-то хочешь? Текстом, или там какой-то формат?
Здесь пока только чтение из файла в массив arr. Идет построчно с перезаписью строки - новая пишется поверх старой.
Нужно: из каждой колонки вытащить цифры в свой отдельный массив, игнорируя пробелы и символ "|". Цифры должны быть как есть, то есть числовой формат, чтобы их потом можно было подать на порт, с порта сразу на ЦАП и дальше работать с напряжением.
На фото исходный документ.
Миниатюры
Чтение данных из файла и их передача через порт компьютера  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 17:07
Ты так и не объяснил как они в порт пойдут. В бинарном виде, что ли? Как float или как double?
Если так, то используй fscanf() и четыре вещественных переменных.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 17:22  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ты так и не объяснил как они в порт пойдут. В бинарном виде, что ли? Как float или как double?
Если так, то используй fscanf() и четыре вещественных переменных.
Они должны пойти как float, вот как они есть. И еще момент. Пока файл пишется, моя программа считывает данные в массив и заканчивает работу, т.е. данные в текстовик пишутся, а программа встала. Как мне сделать ее бесконечно рабочей? Чтобы данные записались в текстовик и тут же из него выдали в мою программу. В реальном времени работа, так сказать.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 17:27
Цикл организуй.
С какой скоростью эти строки записываются?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 17:46  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Цикл организуй.
С какой скоростью эти строки записываются?
Как бы объяснить. Данные продолжают писаться, а программа застыла, то есть она прочла данные до момента открытия. Программа отработала и встала, как показано на рисунке, а данные продолжают писаться.
Миниатюры
Чтение данных из файла и их передача через порт компьютера  
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 17:46  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Цикл организуй.
С какой скоростью эти строки записываются?
Как бы объяснить. Данные продолжают писаться, а программа застыла, то есть она прочла данные до момента открытия. Программа отработала и встала:
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 18:11
Я же сказал - цикл.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
21.05.2017, 19:33  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Я же сказал - цикл.
Все получилось. Но появилась новая проблема. Данные в симуляции обновляются так быстро, что мое приложение не может его отображать своевременно. В связи с этим было использовано Sleep(n);. Теперь данные отображаются пачками через некоторый интервал. Вопрос: как сделать так, чтобы данные шли быстро, но и при этом их можно было рассмотреть без прерывания?
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
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
 
#define N 80
 
using namespace std;
 
int main()
{
    FILE *file;
    char arr[N];
    char pitch[8], roll[16], heading[16];
    file=fopen("Data.txt","r");
while(1){
    while(fgets(arr,N,file) !=NULL)
        printf("%s", arr);
    printf("\n");
        Sleep(50);
}
    fclose(file);
 
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.05.2017, 20:50
Зачем их рассматривать? С какой скорость они поступают?
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
22.05.2017, 15:06  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Зачем их рассматривать? С какой скорость они поступают?
Для наблюдления. А поступают так быстро, что консольное приложение просто не успевает их отображать. На глаз - каждые пол секунды поступают, наверное даже чаще. То есть приложение просто черный экран показывает, иногда цифра проскочит, но это нереально отображать

Добавлено через 3 часа 35 минут
Данные поступают с частотой 99.9гц, Пишутся сверху-вниз, слева-направо построчно, т.е. 4 числа записалось в строку друг за другом с пробелами, строка закончилась и пошла новая. И я смог сделать забивание данных в массивы: 1 колонка - 1 массив, 2 колонка - 2 массив и тд. Но появилась проблема: после какого-то времени данные начинают спутываться и например массив 1 ловит данные 2 колонки, а массив 2 ловит данные 3 колонки и тд, т.е. данные съезжают. Как от этого избавиться.
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
#include <stdio.h>
#include <windows.h>
 
#define N 63
 
using namespace std;
 
int main()
{
    FILE *file;
    char arr[N];
    char pitch[16], roll[16], headingt[16],headingm[16];
    file=fopen("Data.txt","r");
 
while(1){
        fscanf(file,"%s | %s | %s | %s |", pitch, roll, headingt, headingm);
        printf("%s", pitch);
        printf("\n");
}
/*while(1)
 
        printf("%s", arr);
    printf("\n");*/
 
    fclose(file);
        system("pause");
    return 0;
}
Я так понимаю, нужно с \n работать как-то, только как правильно, не понимаю.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.05.2017, 16:50
При частое 100 герц ты ничего не увидишь.

Чтобы данные не путались, попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    FILE *file;
    char arr[N];
    char pitch[16], roll[16], headingt[16],headingm[16];
    char s[100];
    file=fopen("Data.txt","r");
 
    while(1)
    {
        long p = ftell(file);
 
        if (fgets(s, 100, file) != NULL)
        {
            sscanf(s, "%s | %s | %s | %s |", pitch, roll, headingt, headingm);
            printf("%s\n", pitch);
        }
        else
            fseek(file, p, SEEK_SET);
 
    }
 
    fclose(file);
И придумай какой-то способ культурно завершать цикл.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
22.05.2017, 19:51  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
При частое 100 герц ты ничего не увидишь.
Как ни странно, их видно, и достаточно хорошо)
Цитата Сообщение от nmcf Посмотреть сообщение
Чтобы данные не путались, попробуй так:
Большое спасибо, это решило проблему!
Цитата Сообщение от nmcf Посмотреть сообщение
И придумай какой-то способ культурно завершать цикл.
Это не важно) Следующий этап - перевод из char в float и подача float на порт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2017, 19:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru