|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||||||
И снова работа с COM портом16.11.2016, 14:03. Показов 12136. Ответов 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
|
|||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
|
|
| 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
|
||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
|
|
| 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 | |
|
Помогаю со студенческими работами здесь
60
Работа с COM портом Работа с Com портом Работа с COM портом в Builder C++ 6.0 Работа с COM портом на С++ Builder 6 Работа с USB портом. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|