| 
| 
 | Вопрос # 1 154/ вопрос открыт / | 
 |  Здравствуйте, эксперты!
 Тема: "Взаимодействие с мобильным телефоном через Com-порт".
 
 Функции чтения, записи, открытия и настройки порта работают (см. прикреплённый файл - мой вариант). Но есть один момент: если просто читать сразу или через небольшой таймаут, то ответ может быть неполным
 
 В статьях на эту тему советуют организовать потоки для этого, но не получается. Приложение зависает...
 
 В приложении привожу выдержки из лога PortMon двух программ SiMoCo и исходника с delphikingdom.com.
 А также исходник моего варианта (прикреплённый).
 
 Принцип работы исходника мне не подходит. Подскажите, как сделать вариант как у SiMoCo.
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим      IRP_MJ_WRITE	Length 5: ATE0.IOCTL_SERIAL_GET_COMMSTATUS		IOCTL_SERIAL_WAIT_ON_MASK		IOCTL_SERIAL_GET_COMMSTATUS		IRP_MJ_READ	Length 6: ..OK..IOCTL_SERIAL_PURGE	Purge: RXABORT RXCLEAR	IOCTL_SERIAL_WAIT_ON_MASK		IOCTL_SERIAL_PURGE	Purge: TXABORT TXCLEAR 	IRP_MJ_WRITE	Length 5: AT+CGMM.	   IOCTL_SERIAL_GET_COMMSTATUS		IOCTL_SERIAL_WAIT_ON_MASK      http://www.delphikingdom.com/zip/comport.zip  IOCTL_SERIAL_GET_MODEMSTATUSIRP_MJ_READ  
|  |   Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)Вопрос отправлен: 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]:Это где-то в сети готовый вариант был... |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |