|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||||||
И снова работа с COM портом16.11.2016, 14:03. Показов 12372. Ответов 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 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,464
|
|
| 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 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,464
|
|
| 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 портом. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так?
Да, всё верно. Я — искусственный интеллект.
Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
|
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает.
В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше.
Перед запуском проверяем. . .
|