Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 154

/ вопрос открыт /

Здравствуйте, эксперты!

Тема: "Взаимодействие с мобильным телефоном через Com-порт".

Функции чтения, записи, открытия и настройки порта работают (см. прикреплённый файл - мой вариант). Но есть один момент: если просто читать сразу или через небольшой таймаут, то ответ может быть неполным

В статьях на эту тему советуют организовать потоки для этого, но не получается. Приложение зависает...

В приложении привожу выдержки из лога PortMon двух программ SiMoCo и исходника с delphikingdom.com.
А также исходник моего варианта (прикреплённый).

Принцип работы исходника мне не подходит. Подскажите, как сделать вариант как у SiMoCo.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6. IRP_MJ_WRITE Length 5: ATE0.
  7. IOCTL_SERIAL_GET_COMMSTATUS
  8. IOCTL_SERIAL_WAIT_ON_MASK
  9. IOCTL_SERIAL_GET_COMMSTATUS
  10. IRP_MJ_READ Length 6: ..OK..
  11. IOCTL_SERIAL_PURGE Purge: RXABORT RXCLEAR
  12. IOCTL_SERIAL_WAIT_ON_MASK
  13. IOCTL_SERIAL_PURGE Purge: TXABORT TXCLEAR
  14. IRP_MJ_WRITE Length 5: AT+CGMM.
  15.  
  16.  
  17.  
  18. IOCTL_SERIAL_GET_COMMSTATUS
  19. IOCTL_SERIAL_WAIT_ON_MASK
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26. http://www.delphikingdom.com/zip/comport.zip
  27.  
  28.  
  29. IOCTL_SERIAL_GET_MODEMSTATUS
  30. IRP_MJ_READ
  31.  
  32.  


Фамилия Имя Отчество Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 29 ноября 2007, 07:48
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Emfs!
Не знаю как при работе с телефоном, но когда мне приходилось писать драйвер для электронных весов, то логика такая: в документации для оборудования описан формат команды (в частности ее длина), поэтому в цикле считывает порт до тех пор, пока не прочитаем нужное число байт или не прийдет интервал времени (например секунда) и тогда если нужное число байт не пришло, то выдаем таймаут.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 29 ноября 2007, 11:09

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Emfs!
К сожалению, прикреплённый файл почему то не открывается.
По поводу "шлёт постоянно". Есть разные способы работы с портом. Например в порт постоянно посылаются запросы на наличие новых данных. Если есть, то генериться сообщение, которое в конце концов выливается в событие компонента.
Есть другой способ - передающее устройство генерит специальное сообщение, а приёмник (тоесть компьютер) ждет его. Каждый способ по своему хорош.

Почему же не приходят все данные? очень просто. вы их просто "недочитываете". Дело в том, что если вы работаете в неблокирующем режиме, то данные не обязаны приходить одним пакетом! они могут приходить в несколько пакетов. Вот нужно и собирать данные. если вы воспользуетесь библиотекой synapser, которую я предлагал, то вы решите эти проблемы

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 ноября 2007, 13:46


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 30 ноября 2007, 17:37; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 30 ноября 2007, 16:57 [#1]:

Я посмотрел исходники. Зачем было реализовывать ручками, к тому же с ошибками, если есть готовая библиотека?
Галочка "подтверждения прочтения" - вселенское зло.
Фамилия Имя Отчество

Фамилия Имя Отчество (статус: Посетитель), 30 ноября 2007, 17:37 [#2]:

Это где-то в сети готовый вариант был...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.