Форум программистов, компьютерный форум CyberForum.ru

Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Urban_88
0 / 0 / 0
Регистрация: 23.08.2014
Сообщений: 10
23.08.2014, 21:07     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #1
Здравствуйте форумчане, передо мной стала задача, которую я никак не могу осилить, а именно анализ данных с COM порта. Принимать данные с COM порта я научился. Не судите строго идея может быть бредовая, но по другому я пока не знаю как это реализовать. Принятые данные я записываю в файл receiver.txt и мне нужно проанализировать с первого до последнего принятого байта. Но загвоздка в том, что файл может записываться несколько часов, потом потребуется я думаю, еще не мало времени, что бы его расшифровать. Есть ли способ чтения файла в процессе его изменения? Если сморозил глупость, то скажите, как нужно сделать правильно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 21:07     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения?
Посмотрите здесь:

C++ Подскажите простую реализацию динамического массива и его использование с возможностью изменения его размера
C++ Создание файла для записи и чтения, запись в файл данных
Как определить время чтения данных из файла в миллисекундах? C++
Создайте производный класс с дополнительными полями, конструктором по умолчанию и методами чтения/изменения значений этих полей C++
C++ Есть лёгкий способ отсортировать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
23.08.2014, 21:24     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #2
...данные поступают столь редко, что для этого требуется несколько часов? Инерционный процесс какой? Если это так и данных мало, то накопление можно осуществлять и в памяти программы REALTIME и тут же проводить анализ. А файл пусть своего рода архив.

потребуется я думаю, еще не мало времени, что бы его расшифровать
укажите объем данных и что требуется анализировать. Делать выводы на основании лишь ваших "я думаю" никто не будет.

Есть ли способ чтения файла в процессе его изменения?
да, если открыть файл на чтение и запись. А поскольку доступ нужен из своего же приложения, то в монопольном или не монопольном, без разницы. Кроме того, для упрощения работы следует сразу определиться со структурой своего файла-архива.

http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
Urban_88
0 / 0 / 0
Регистрация: 23.08.2014
Сообщений: 10
23.08.2014, 21:53  [ТС]     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #3
Данные поступают с интервалом между пачками от 50мкс до 200 мкс. Про несколько часов - это в худшем случае. Сейчас я не могу сказать, как долго будет работать аппаратура. Ждем ответа от тематиков. К сожалению, я очень плохо разбираюсь в прикладном программирование. Сам я занимаюсь микроконтроллерами. Но вот тут поставили такую задачу. Если вас это не затруднит. Можете выложить кусочек кода, что бы я начал разбираться. Сам я работаю в C++ Builder.

Добавлено через 1 минуту
Цитата Сообщение от raxp Посмотреть сообщение
Кроме того, для упрощения работы следует сразу определиться со структурой своего файла-архива
Здесь я вас не совсем понял.
_Ivana
2191 / 1396 / 124
Регистрация: 01.03.2013
Сообщений: 4,154
Записей в блоге: 2
23.08.2014, 22:01     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #4
Цитата Сообщение от Urban_88 Посмотреть сообщение
Принятые данные я записываю в файл receiver.txt
Имхо зачем в txt? Вы собираетесь его потом глазами смотреть? В какой-нибудь скриптовый парсер засовывать? Я еще с NMEA наелся этого парсения человечески-ориентированного текста, вы же занимаетесь микроконтроллерами - пишите в файл сразу байты подряд как они поступают с порта. Как бы вы решили эту задачу на микроконтроллере? Правильно, нарезаете щедрый кусок памяти, и по прерыванию приема байта с USART пишете его в память, инкрементируете указатель - все. Здесь то же самое.
ЗЫ если задача позволяет - лучше организовать небольшой кольцевой буфер и успевать обрабатывать поступившие данные быстрее чем они поступают - не нужен большой кусок памяти для хранения всех данных одним куском.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
23.08.2014, 22:16     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #5
1- кусочек кода есть по ссылке, в вашем случае работа через класс TFileStream
2- "Здесь я вас не совсем понял." - ну а как вы собираетесь искать что-то в файле? Должна быть какая-то точка отсчета-метка для ориентира. Шапка с описанием архива в файле, далее объем данных и сдвиг откуда начинать, все это некий фиксированный размер байт.
3- "Имхо зачем в txt? Вы собираетесь его потом глазами смотреть?" - хоть .blabla, и почему бы и не посмотреть? Очень удобно сразу видеть, что там и с чем. XML может и не надо, но для будущего очень неплохой задел, но тот же CSV формат записи тоже неплох. В любом случае что-то советовать и делать выводы при отсутствии пояснения TC о объеме данных, их типе и дальнейшем использовании, рано. Может он в WEB потом их вываливать будет? А тут XML очень даже кстати.
Etien
20 / 20 / 0
Регистрация: 26.01.2014
Сообщений: 176
23.08.2014, 22:25     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #6
Читать своей программой COM я так понял ты умеешь. Вот и читай его в какой свой буфер - массив. Оттуда и анализируй, и делай выводы. И если нужен архив, то пиши то, что принял из COMa в файл в любом тебе понятном виде. И даже пусть это *.txt будет.
Всегда твой - Etien.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
23.08.2014, 23:06     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #7
Что за данные приходят от порта? Есть ли какой-то протокол передачи этих данных? Опишите свою задачу более предметно, иначе сложно что-то советовать.
Urban_88
0 / 0 / 0
Регистрация: 23.08.2014
Сообщений: 10
25.08.2014, 21:13  [ТС]     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #8
Моя задача - это прослушивание канала, то есть прослушивать, как одна аппаратура общается с другой.

В мою задачу входит отлавливать байты, порядко 150 if и плюс еще от 5 до 8 if внутри каждого if и выводить соответственные сообщения. В порт приходят пачки от 5 до 8 байт. как писал выше время между сообщениями от 50мкс до 200 мкс. Тут посоветовали про буфер, я думал про это, идея не плохая. Но мне очень хочется сделать всё по человечески. Первостепенная задача это складирование байтов в txt файле. А во время, когда порт молчит анализ этих данных.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
25.08.2014, 22:09     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #9
прослушивать, как одна аппаратура общается с другой.
на каком удалении друг от друга? Потому как если десятки, сотни метров, то тут не RS-232, а RS-422/485, а то и Ethernet и прослушивать совсем не проблема.

В мою задачу входит отлавливать байты, порядко 150 if и плюс еще от 5 до 8 if внутри каждого if и выводить соответственные сообщения. В порт приходят пачки от 5 до 8 байт.
это все витиевато. Есть протокол обмена?

А во время, когда порт молчит анализ этих данных.
ничего не мешает после приема передавать в параллельный поток для обработки.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.08.2014, 22:20     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #10
Цитата Сообщение от Urban_88 Посмотреть сообщение
А во время, когда порт молчит анализ этих данных.
Анализировать данные можно в отдельном потоке.

Цитата Сообщение от Urban_88 Посмотреть сообщение
В мою задачу входит отлавливать байты, порядко 150 if и плюс еще от 5 до 8 if внутри каждого if и выводить соответственные сообщения. В порт приходят пачки от 5 до 8 байт.
Как уже сказали, это выглядит слишком запутанно. Должен быть какой-то более общий протокол.
_Ivana
2191 / 1396 / 124
Регистрация: 01.03.2013
Сообщений: 4,154
Записей в блоге: 2
25.08.2014, 22:28     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #11
Не понимаю зачем опытные участники требуют с потерпевшего автора какой-то протокол... Ну слушает он космос, космос ему шлет пачками какие-то байты, автор хочет писать их подряд в txt и потом разглядывать и искать послания внеземного разума какие-то закономерности, может график построить и т.п. Только какой-то особой проблемы в реализации всего этого я пока не вижу.
Urban_88
0 / 0 / 0
Регистрация: 23.08.2014
Сообщений: 10
25.08.2014, 22:36  [ТС]     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #12
Цитата Сообщение от raxp Посмотреть сообщение
это все витиевато. Есть протокол обмена?
К сожалению протокол выложить не могу, боюсь тюрьмы, аппаратура не гражданская.
Цитата Сообщение от raxp Посмотреть сообщение
ничего не мешает после приема передавать в параллельный поток для обработки.
Вы уж извините меня, но я не знаю как это сделать. Я буду очень признателен, если поможете. Это нужно сделать с помощью TfileStream ?

Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
Только какой-то особой проблемы в реализации всего этого я пока не вижу
Можете с кодом помочь ?
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
25.08.2014, 22:39     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #13
Threads:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
_Ivana
25.08.2014, 22:41
  #14

Не по теме:

Цитата Сообщение от Urban_88 Посмотреть сообщение
Можете с кодом помочь ?
Смотря для какого государства вы делаете эти негражданские разработки Хотя в любом случае эта ситуация очень напоминает как Остап Бендер и Киса Воробьянинов назвались художниками чтобы попасть на корабль

John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.08.2014, 22:57     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #15
Urban_88, в общем случае можно сделать так:
1) Постоянно крутится поток, читающий ком-порт, и складывает все принятые байты в некоторый буфер.
Вот примерный алгоритм работы с ком-портом: http://www.piclist.ru/S-COM-THREAD-R...HREAD-RUS.html
2) Также постоянно крутится поток протокола, который читает вышеуказанный буфер. Он считывает данные из буфера по определённому алгоритму (который ты описал как 150 if) и извлекает из принятых байт полезную информацию, отсекая всякую протокольную "ерунду": начало посылки, длину посылки, CRC и т.д. Полезную информацию в виде цельных посылок (например, vector<byte> или подобного) отправляет в буфер посылок.
3) Поток анализа данных выбирает эти посылки и, соответственно, анализирует.

Если протокол многоступенчатый (т.е. над одним уровнем протокола находится ещё один протокол и т.д.), то можно на каждый уровень протокола назначать по потоку. Обмен между ними - через непрерывный буфер байт или цельными посылками.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
25.08.2014, 23:03     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #16
TC, скачайте себе Работа с COM-портом с помощью потоков.pdf и схороните.
Urban_88
0 / 0 / 0
Регистрация: 23.08.2014
Сообщений: 10
25.08.2014, 23:36  [ТС]     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #17
Цитата Сообщение от raxp Посмотреть сообщение
TC, скачайте себе Работа с COM-портом с помощью потоков.pdf и схороните.
Я как раз с этим и документом работал, когда писал свою программу.
я с помощью вот этого кусочка и записываю файл

//---------------------------------------------------------------------------

//выводим принятые байты на экран и в файл (если включено)
void __fastcall ReadThread::Printing()
{

Form1->Memo1->Lines->Add((char*)bufrd); //выводим принятую строку в Memo
Form1->StatusBar1->Panels->Items[2]->Text = "Всего принято " + IntToStr(counter) + " байт"; //выводим счётчик в
строке состояния

if(Form1->CheckBox3->Checked == true) //если включен режим вывода в файл
{
write(handle, bufrd, strlen(bufrd)); //записать в файл данные из приёмного буфера
}
memset(bufrd, 0, BUFSIZE); //очистить буфер (чтобы данные не накладывались друг на друга)
}

//---------------------------------------------------------------------------
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 23:58     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения?
Еще ссылки по теме:

C++ Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
C++ Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
C++ Есть массив в виде табличных данных, как его поделить на отдельные элементы для дальнейшей работы?

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

Или воспользуйтесь поиском по форуму:
-NEURON-
Заблокирован
25.08.2014, 23:58     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? #18
Послушай, как тут уже упоминали, аппаратура общается между собой по какому - то протоколу, он тебе известен? Если да - ловишь команды и ответы на них и анализируешь сразу, обычно обмен идёт в формате телетайпа.
Yandex
Объявления
25.08.2014, 23:58     Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения?
Ответ Создать тему
Опции темы

Текущее время: 22:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru