|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||||||
И снова работа с COM портом16.11.2016, 14:03. Показов 12816. Ответов 67
Метки нет (Все метки)
Приветствую всех. Уже измучился и измаялся весь пытаясь написать функцию. Помогите, пожалуйста...
Описание задачи Создается программа для работы с прибором. Соединение с прибором осуществляется посредством преобразователей, которые при подключении к компьютеру создают виртуальный COM порт. Преобразователь может подключаться к прибору посредством проводного (RS-485) или беспроводного (инфракрасный канал) соединения. Прибор всегда является ведущим, то есть информацию выдает только по запросу от компьютера (получил корректный запрос - выдал ответ). Целостность запросов и ответов определяется циклическим избыточным кодом в конце запроса или ответа. Текущая реализация На данный момент я создал класс для работы с прибором. Экземпляр этого класса будет создаваться и работать в отдельном потоке. В классе будут реализованы конкретные функции для работы с прибором (например - прочитать серийный номер прибора). Каждая из этих функций подготавливает соответствующий запрос прибору и вызывает внутреннюю функцию обмена данными SwapData. Указанная функция, по сути, выполняет основную работу класса: отправляет созданный запрос в COM порт и получает ответ из COM порта. Именно данную функцию я не могу написать. Начало функции SwapData выглядит примерно так:
Описание проблемы Прием ответа от прибора сопряжен с несколькими трудностями. Во первых, ответ необходимо принять максимально быстро. То есть, не должно быть простоев в работе функции SwapData. Во вторых, на один и тот же запрос прибор может ответить разным количеством байт (либо вообще не ответить). Это связано с тем, что прибор может получить некорректный запрос (например, ошибка при передаче). Тогда он, скорее всего, вообще не ответит. Так же в каком-то конкретном приборе может быть отключена какая-то функция и прибор на запрос, связанный с этой функцией, выдаст не ожидаемое количество байт, а другое, которое сигнализирует об ошибке. В связи со всем этим появилась попытка решения задачи приема данных. Попытка реализации чтения данных В нижеприведенном коде я реализовал алгоритм, когдаПривожу код, который отвечает за прием данных:
Помогите советом как реализовать прием данных максимально быстро и полно.
0
|
|||||||||||
| 16.11.2016, 14:03 | |
|
Ответы с готовыми решениями:
67
Работа с COM портом работа с COM портом Работа с COM-портом |
|
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
|
|||
| 19.11.2016, 07:18 | |||
|
Добавлено через 8 минут
0
|
|||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 19.11.2016, 08:10 | |
|
седьмой, Avazart, протокол ТС РЕАЛЬНО не позволяет различить ответ при ошибке от ответа при успехе. УВЫ. Поэтому такие вот загоны
2
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 19.11.2016, 09:41 [ТС] | |
|
Avazart, спасибо за пример. Так как с асинхронным режимом не работал, то мне надо немного времени чтобы разобраться. Но параллельно с этим у меня к Вам вопрос. Почему Вы опять ругаете за использование синхронного режима? Если ранее причину я видел в использовании Sleep-ов и циклов, то сейчас этого нет. Функции
WriteFile и ReadFile работают по настроенным таймаутам и, как показал эксперимент, работают правильно без лишних задержек. Почему синхронный режим deprecated?
0
|
|
|
|
|||
| 19.11.2016, 14:41 | |||
|
0
|
|||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||
| 19.11.2016, 15:44 [ТС] | |||
ReadFile если прибор не ответит и в порт не придет ни одного байта?
0
|
|||
|
|
||
| 19.11.2016, 15:49 | ||
|
А что за устройство такое? И кто производит такое?
Хотя с таким маленьким таймаутом это вовсе будет не заметной задержкой.
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 19.11.2016, 16:00 [ТС] | ||||||
|
Avazart, возможно ли отправить и принять данные асинхронно в рамках одной функции и без создания потоков?
0
|
||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 19.11.2016, 19:12 [ТС] | ||
|
В связи с этим уточнением снова задаю тот же вопрос: возможно ли отправить и принять данные асинхронно в рамках одной функции и без создания потоков?
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 19.11.2016, 20:51 [ТС] | ||
|
Попробую снова объяснить что я хочу реализовать, хотя в первом посте такая попытка была. Буду объяснять упрощенно, главной сути это не меняет.
В главном окне программы есть кнопка для чтения параметров из прибора. При нажатии на эту кнопку создается поток, а так же окно процесса чтения, которое тут же выводится в модальном режиме. Поток при создании начинает сразу выполняться. В первую очередь он создает объект класса, который содержит функции для получения информации от прибора. С помощью этого объекта поток открывает COM порт и настраивает его. Далее поток начинает вызывать функции, которые получают от прибора нужную информацию. При вызове такой функции она формирует запрос для прибора, вызывает внутреннюю функцию класса SwapData, которая отправляет запрос в прибор и получает ответ, и возвращает результат ответа от прибора (или возвращает ошибку обмена с прибором). Во всех функциях класса, которые получают информацию от прибора, есть функция SwapData. После подготовки запроса его надо отправит в прибор и получить ответ. После отправки запроса и до получения ответа от прибора делать ничего не надо. Именно поэтому передача и прием находятся в одной функции.Экземпляр класса для работы с прибором создается и работает в потоке. Но сам он потоков не создает. Добавлено через 42 секунды SwapData именно это и делает.
0
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 20.11.2016, 09:48 | |
|
d7d1cd, все будет работать в одной функции - и передача и прием. лагов интерфейса не будет если этот обмен будет не в потоке UI. хотя, если речь идет об однократном запросе-приеме с малыми тайм-аутами то лагов не будет заметно даже если вы все это сделаете в UI
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 20.11.2016, 17:08 [ТС] | ||
|
0
|
||
|
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
|
||||
| 21.11.2016, 06:46 | ||||
|
Напишите, что это хоть за устройство такое)))
0
|
||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||
| 21.11.2016, 08:19 [ТС] | ||||
|
0
|
||||
|
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
|
||
| 21.11.2016, 08:32 | ||
|
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 21.11.2016, 08:41 [ТС] | |
|
ITDeveloper, согласен. В моем случае возможно на один COM порт (точнее на один преобразователь) повесить даже более 100 устройств. COM порт будет при этом один. Только в этом случае разве можно одновременно отправить запросы более чем к одному устройству? COM порт, на сколько я знаю, передает данные последовательно бит за битом. Одновременно данные передавать не получится, одновременно работать более чем с одним устройством не получится.
0
|
|
|
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
|
||
| 21.11.2016, 08:57 | ||
|
Во первых: цена вопроса( на каждое устроство не надо будет отдельный преобразователь). Во вторых: когда у вас будут все устройства в одной сети modbus, то вы можете формировать шировещательные запросы ко всем устройствам одной командой. В общем нижний уровень(архитектура) системы значительно упрощается и удешевляется!
Конечно здесь не будет полного параллелизма в работе с устройствами, в прочем, как и не будет его даже если вы будете использовать разные com порты. Ваша задача это обычная типовая задача. Для этого существуют стандартные решения. Поверьте не логично и не правильно городить огород из кучи преобразователей! Этот проект в итоге знающие специалисты в конечном счете похоронят и вам придется начинать сначала!
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 21.11.2016, 09:07 [ТС] | |
|
ITDeveloper, я признал свою ошибку. Не будет кучи преобразователей. Он будет один.
По поводу широковещательного запроса Вы тоже правы. Вот только на широковещательный запрос прибор не отвечает и отпадает необходимость читать ответ.
0
|
|
| 21.11.2016, 09:07 | |
|
Работа с COM портом Работа с Com портом Работа с COM портом в Builder C++ 6.0 Работа с COM портом на С++ Builder 6 Работа с USB портом. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|