Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Алгоритм считывания данных с COM порта  (Прочитано 3259 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Задача такая. Данные в ком порт с внешнего устройства посылаются не постоянно, а только по команде от программы на компьютере. Например я из программы посылаю команду "выдать данные" и по этой команде устройство должно выдать мне данные. все вобщем-то отлично, искусственно кидаю в ком порт команды и получаю правильные ответы и данные. НО! как мне в своей программе получить эти данные? то есть проблема вот в чем: программно отправляю команду "выдать данные" и сразу должен слушать ком порт? или прослушку ком порта организовать в отдельном потоке в бесконечном цикле и ловить данные таким образом?


Пользователь решил продолжить мысль 16 Ноябрь 2011, 00:39:25:
я к чему спрашиваю. думаю может можно обойтись без потока? я сделал так:
послать запрос "выдать данные"
принять результат запроса
но данные получаю только со второго раза. и они могут быть хаотичными. то есть если 100% известно, что должно прийти true, то оно приходит в 98% случаев.

Пользователь решил продолжить мысль 16 Ноябрь 2011, 00:44:15:
пишу под виндой. но думаю, алгоритмы ведь не отличаются кардинально.
« Последнее редактирование: 16 Ноябрь 2011, 00:57:20 от Fluffy1234567890 »

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Алгоритм считывания данных с COM порта
« Ответ #1 : 16 Ноябрь 2011, 03:58:27 »
Де код? Какой язык?

qserialdevice - и никаких проблем.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #2 : 16 Ноябрь 2011, 17:25:31 »
программу пишу в среде Делфи 7. зачем код? я хочу узнать каким образом ловить данные сразу после запроса их выдать. делать это в потоке или можно обойтись без него. если можно без него - то как.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #3 : 17 Ноябрь 2011, 20:19:35 »
принципиально не отличается
мысли правильные так держать
на дельфе что-то писать вспоминать желания нет есть форум посвящённый дельфе на rsdn как минимум и еще миллион
анализируй считанные данные
читай в буфер, ищи заголовок ответа, вычитывай данные пока не будет получен весь ответ, проверяй контрольную сумму
всё стандартно, всё уже украдено до нас.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #4 : 17 Ноябрь 2011, 22:55:56 »
я, кажется, поторопился с вопросом на форуме здесь. завтра проверю идею. в теории - должно работать все. в принципе оно все у меня работает отлично, просто пишу библиотеку-обертку для своего устройства и на этапе написания именно функций, которые возвращают данные застопорился. завтра попробую реализовать свою мысль, отпишусь если что. спасибо.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5216
  • Все по палатам!
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #5 : 17 Ноябрь 2011, 23:10:12 »
я, кажется, поторопился
Вообще-то на просторах инета есть компоненты/исходники на дельфи для работы с сом портом...
(Все уже украдено до нас)
Извините, я все еще учусь

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #6 : 17 Ноябрь 2011, 23:16:29 »
дело не в компонентах\исходниках. я отлично справлялся и справляюсь и без них. я спрашивал про алгоритмы получения данных с порта. думал можно обойтись без потока. но я придумал решение для своей задачи и с помощью потока.

Пользователь решил продолжить мысль 17 Ноябрь 2011, 23:18:24:
то есть я сначала думал, что именно для моей задачи не подходит решение с бесконечным циклом в потоке. но пораскинул ленивыми мозгами и пришел к выводу, что решение с потоком и циклом подходит. вот.
« Последнее редактирование: 18 Ноябрь 2011, 10:37:36 от Fluffy1234567890 »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #7 : 22 Ноябрь 2011, 09:11:31 »
ТС, Ваша задача стандартная.
1. Конечно, требуется отдельный поток.
2. Критерием прохождения полного пакета является исчерпание таймаута между принятыми данными (если не знаете, когда начинать обрабатывать пакет или требуется только полный пакет для обработки).

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #8 : 22 Ноябрь 2011, 11:16:30 »
задача конечно стандартная но не обязательно требуется отдельный поток. мультиплексирование ввода вывода прекрасно решит данную проблему в одном потоке.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #9 : 22 Ноябрь 2011, 14:55:38 »
задача стандартная. и вроде справился. в отдельном потоке принимаю данные с порта. на счет целостности пакета можно поподробнее..? с устройства я по UART посылаю символы, и их принимаю в своей программе. пока что не было замечено, что символы не приходят или пропадают. то есть механизм проверки целостности пакета я вобще не реализовывал.

а по поводу мультиплексирования ввода-вывода - я еще слишком молод, чтобы знать такие страшные вещи :)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #10 : 22 Ноябрь 2011, 16:23:27 »
задача стандартная. и вроде справился. в отдельном потоке принимаю данные с порта. на счет целостности пакета можно поподробнее..?
Допустим используется протокол что-то  типа modbus. Master (клиент) попросил нечто, Slave (сервер) выдал это нечто, Master (клиент) принял это нечто.
Критерием правильности прохождения пакета является соответствие КС (который считается, например, как остаток от деления числа образованного переданным пакетом на большое простое число), который считается на основе всего пакета, причем это относится к всем пакетам.
ЗЫ. Чтобы Вы не думали, что это что-то особенное, аналогично дело обстоит с TCP.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #11 : 22 Ноябрь 2011, 19:45:37 »
задача стандартная. и вроде справился. в отдельном потоке принимаю данные с порта. на счет целостности пакета можно поподробнее..?
Допустим используется протокол что-то  типа modbus. Master (клиент) попросил нечто, Slave (сервер) выдал это нечто, Master (клиент) принял это нечто.
Критерием правильности прохождения пакета является соответствие КС (который считается, например, как остаток от деления числа образованного переданным пакетом на большое простое число), который считается на основе всего пакета, причем это относится к всем пакетам.
ЗЫ. Чтобы Вы не думали, что это что-то особенное, аналогично дело обстоит с TCP.

спасибо.
а если в моем случае речь о протоколе не идет вообще. в моем случае так: посылаю команду - на устройстве выполняется действие. устройство посылает команду - в программе выполняется действие. собственно эти команды есть обычные символы. может это слишком просто и неправильно, но это работает. имеет ли смысл как-то проверять целостность такого "пакета"? то есть имеет ли смысл придумывать определенный формат пакета и в программе проверять, пришел правильный формат или нет?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #12 : 23 Ноябрь 2011, 08:20:27 »
Если Вы не боитесь, что от помех что-то включится или выключится ( и при этом кого-то задавит или отключит от жизненно важного устройства), то конечно.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #13 : 23 Ноябрь 2011, 13:04:45 »
никого не задавит от случайных помех) если замечу глюки в передаче и приеме комманд - буду думать о целостности, а пока что оставлю без изменений. спасибо за ответы.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Алгоритм считывания данных с COM порта
« Ответ #14 : 23 Ноябрь 2011, 13:57:09 »
вобщем-то лепить контрольные суммы в tcp не стоит ибо доставка пакетов и их последовательность гарантируется. если что-то будет не так соединение порвётся. если конкретно про modbus то там это как пережиток от последовательных интерфейсов осталось.

про мультиплексирование погугли =) select poll epoll

 

Страница сгенерирована за 0.086 секунд. Запросов: 26.