|
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
|
|
Своевременное получение данных их serial и обработка уже полученных данных25.06.2024, 17:30. Показов 2045. Ответов 33
Метки нет (Все метки)
Всем привет
Нужна помощь в понимании, как правильнее реализовать алгоритм, в идеале конечно с базовым примером. В serial приходят некоторые данные, затем эти данные нужно обработать. Я столкнулся с тем, что обработка данных занимает больше времени чем период приёма данных в serial и получается спорадический пропуск пришедших данных, т.е пока я обрабатываю в некой функции пришедшие ранее данные, в это время приходят новые, а код занят обработкой предыдущих. Сейчас в функции serialPort1.Read я получаю данные, помещаю их в массив, затем вызываю функцию foo(некие параметры) которая их обрабатывает и так по кругу. Пришла в голову идея, помещать полученные данные в очередь и создать отдельный поток, в котором я буду обрабатывать полученные данные, ранее я не прибегал к созданию потоков и честно говоря столкнулся с препятствием, в виде ошибки, что попытка получит данные из другого потока. Подскажите, стоит ли прибегать к потокам для реализации данной задачи или есть какие то другие пути ?
0
|
|
| 25.06.2024, 17:30 | |
|
Ответы с готовыми решениями:
33
Обработка полученных данных.
Обработка данных, полученных от React |
|
|
||||||
| 27.06.2024, 13:40 | ||||||
|
Очередь, на то и очередь, чтобы заполняться одним "циклом", а считываться другим, со своим собственным ритмом. Какой толк от очереди (зачем она нужна), если по каждому событию приема будет пинаться ивент для обработки? Или - зачем мне ивент, если мне НЕ нужно сейчас делать что-то с данными? Ну, условно. Он просто хочет обработать все пришедшие посылки, ничего не пропустив. А это само собой уже предполагает отсутствие какой-либо синхронизации. Добавлено через 8 минут sonmax, в данном случае я говорю о ситуации, когда данные априори есть, т.е. идут постоянно. А их обработка вариативна по времени, типа "когда надо, тогда и лезем в буфер". Добавлено через 12 минут Vladimirchy, а вообще, COM-порт - это такая штука, которую не желательно сваливать в некий неконтролируемый режим работы. Здесь, возможны две генеральные ситуации: 1. когда данные отправляет устройство само по себе (когда ему вздумается). В таком случае приемник ничего не решает в части приема: данные пришли - взвелся флаг. 2. когда получение данных происходит по принципу Запрос-Ответ. Здесь уже приемник инициализирует получение данных, когда ему это нужно. И как правильно подметил Wolfdp, нужно строить логику так, чтобы не было явных простоев/ожиданий приема/обработки.
0
|
||||||
|
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
|
||
| 27.06.2024, 14:42 [ТС] | ||
|
И что бы почем зря не гонять во втором потоке цикл опрашивая постоянно очередь -а не пуста ли она, нужно как то сообщать и выходить самое простое это семафор ? Если бы это было на МК, то это был бы зря потраченный ресурс в пустую, т.к там ограничена и память и процессор, а на сколько это критично для ПК, мне пока не ясно.
0
|
||
|
|
|||
| 27.06.2024, 14:54 | |||
|
Vladimirchy, пока, на данном этапе, всем не очень понятна ситуация в целом: т.к. если данные приходят всегда с опережением относительно обработки, то наступит момент, когда "очередь" переполнится и/или этот постоянно накапливающийся "хвост" будет никогда не обработан.
Следует пересмотреть весь алгоритм обмена с МК. Данные могут приходить быстрее, чем их обрабатывает остальная часть приложения, но в этом случае необходима некоторая выдержка между пакетами, которая нивелирует постоянно накапливающийся буфер. А пока создается впечатление, что в ведро наливается вода из 3-хлитровой банки, а вычерпывается стаканом. Однажды вода польется через край ведра...
0
|
|||
|
|
||
| 27.06.2024, 14:54 | ||
|
И честно говоря меня удивляет "ТСу это не надо, слишком сложно". Т.е. работать с COM-портами и многопоточностью он вроде как и умеет, но вот семафор -- уже сложно? На мой взгляд потратить 20 минут на чтение что это такое, как оно работает, и как склеить вместе конкурентную очередь и семафор -- не составит труда.
0
|
||
|
|
||||
| 27.06.2024, 15:13 | ||||
|
Тут хошь/не хошь придется создавать другой поток для обработки данных, особенно, если она довольно длительная. Добавлено через 2 минуты Wolfdp, я к тому, что ТС еще даже толком не выработал (не понял) саму концепцию - как будет работать COM в его системе. А тут его нагружают семафорами в нагрузку... Я не спорю что его можно применить. Добавлено через 2 минуты Добавлено через 10 минут От сюда могут вытекать и другие нюансы: данные есть в каком составе? Все ли они пришли или только половина? Какие данные в очереди, на какой запрос? Какова длина очереди? И т.д. Пусть с этим сперва разберется, думаю.
0
|
||||
|
|
||||
| 27.06.2024, 16:28 | ||||
|
Wolfdp, я купил на озоне телевизор. Чуть позже я докупил кронштейн, чтобы повесить его на стену. Через пару дней мне приходит уведомление, что в таком-то пункте озона пришел мой телевизор. Теперь я знаю что он там есть, но не бросаю все дела и не мчусь туда за ним. Потому что я знаю, что должен придти еще кронштейн к нему. И когда он придет (об этом уведомление), я приеду и заберу все сразу, одним ходом. Ситуация несколько прояснилась? Если переложить аналогию? Я как бы... смотрю от лица ТСа - сейчас я мало смыслю в самом ком-порту и не очень понимаю что такое семафор... Выход: нужно прям сразу бросаться во "все тяжкие" и брать нахрапом ) Добавлено через 10 минут
0
|
||||
|
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,719
|
||
| 27.06.2024, 21:28 | ||
|
0
|
||
| 28.06.2024, 09:15 | ||
|
Поймите правильно я ни сколько не хочу принизить ваши знания и навыки, но блин это же первое о чём следовало подумать. Если какая-то свистелка-перделка пуляет данные со скоростью выше той, с которой эти данные могут быть обработаны, то это изначально провальная идея. На простом примере, допустим есть устройство, которое в протоколе UDP пуляет видео высокого качества, а слабый ПК это видео декодирует и отображает. Это очень похоже на ваш случай. А теперь внимание вопрос: как вы думаете что увидит пользователь на экране ПК? Ответ: либо это будет картинка высокого качества, но с прореживанием кадров, либо картинка низкого качества, а возможно и пониженного разрешения, либо вообще черный квадрат и сообщение об ошибке. Всё это обусловлено тем, что ПК не успевает прожевать всё то, что на него сыпется. И если с видеопотоком наработаны решения проблемы (см. выше), то в случае важных данных так делать нельзя от слова совсем. VladimirU, вам следует применить или в крайнем случае разработать самому простой протокол прикладного уровня с синхронизацией передачи данных. Либо оставить как есть, но тогда алгоритм обработки данных должен уметь пропускать всё то, что не успело обработаться, т.е. частично или полностью выкидывать данные из буфера если пришёл новый пакет, а буфер уже битком. Не по теме: Всем участникам темы сорян, не хотел влезать, но бомбануло так, что решил написать в теме.
1
|
||
|
|
|
| 28.06.2024, 12:30 | |
|
VladimirU, распишите что вы вообще делаете с этими данными? Просто показываете на UI. Куда-то сохраняете? Куда-то отправляете? Мониторите и при каких-то значениях нужно что-то вызвать? Можно ли обрабатывать данные независимо друг-от-друга?
0
|
|
|
|
|
| 28.06.2024, 13:43 | |
|
На самом деле, в промышленных системах ситуация с отложенной обработкой принятых данных довольно частое явление. Приходящие данные буферизируются куда-то и ждут своего часа икс, когда их кто-то заберет и обработает.
Однако, это не значит что они льются в приложение нескончаемым неуправляемым потоком, и соответственно, случаи с переполнением и выкидыванием "лишних" данных не допустимы. Тут ТСу надо четко подумать что делать в таких случаях.
0
|
|
|
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
|
|
| 28.06.2024, 14:23 [ТС] | |
|
Господа, мне кажется что некоторых уже понесло и ответы пошли не тем людям)
Давайте немного упорядочим тему. Вопрос изначально был о том, как сделать в языке С#, (если перефразировать) что бы одна функция не тормозила выполнение другой, т.е работали асинхронно, каждая в своём темпе. То что нужно следить: а пришел ли весь пакет с порт или нет, цел он не цел, всё пришло или нет, это всё понятно, но это не имеет отношения (или прямого отношения) к вопросы асинхронности. Так же понятно что если лить из ведра в бочку, а черпать ложкой, то бочка заполнится и потечет через края. Расписывать откуда идут данные в ПО и почему их так много/часто или что делает моё ПО -не имеет смысла, хотя бы потому, что это не имеет отношения к теме, если в какой то момент я пойму, что какая то часть моего кода занимает много времени и нужно как то оптимизировать, то есть смысл создать новую тему и уже разбирать там, не смешивая мух и котлеты. По всей видимости, у участников складывается автоматические выводы, что если нет знаний в языке С#, то точно не имеет представления ни в чем другом) Я хорошо владею языком Си и на приличном уровне С++, больше части работаю с МК с использованием ОСРВ и там тоже есть таски, очереди, семафоры, мютексы и т.д и понимание как сделать так, что бы одна медленная функция не влияла на работу всей системы -есть, другое дело какие инструменты имеются в С# и именно это я бы хотел узнать, т.е какие инструменты есть и какими лучше воспользоваться. Есть какие то различия в цели назначения семафоров в ОСРВ и С# ? если нет, то обрадую: я знаю что такое и для чего семафор, понятно что синтаксис его может отличатся в С#, но это уже детали. Возможно в С# можно как то сделать, что если пришло что то в порт, а я где-то в другой функции, бросить эту функцию, скопировать сообщения например в очередь и вернутся обратно где был ? И хотел выразить благодарность всем, кто пытается мне помочь) Добавлено через 4 минуты Я время не теряю и не жду на блюдечке готового решения, я немного начал вникать и если я правильно понял, для моей задачи можно использовать Асинхронность (async, await) или многопоточность (thread), но я не совсем понял, в чем между ними разница.
0
|
|
| 28.06.2024, 14:49 | |||
|
Добавлено через 3 минуты
0
|
|||
|
|
||||
| 28.06.2024, 14:56 | ||||
|
Добавлено через 6 минут Ещё такой момент -- если какой-то Invoke зависнет -- повиснет вся форма и не будет реагировать ни на что. Причем если там ещё и зависимость от UI действий, то легко поймать дедлок, из-за которого повиснет уже функционал. Нужно максимально подготавливать данные для отображения, и только потом их пинать на UI. Если данных слишком много для обновления: вводим таймер, который раз в N-миллисекунд проходит по моделям статуса и обновляет значения на UI-элементах.
0
|
||||
| 28.06.2024, 14:56 | |
|
Обработка полученных данных с COM порта
Обработка полученных данных и их запись в поле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|