| 
| 
 | Вопрос # 3 140/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Работаю с COM портом. в программе открывается СОМ1, настраивается и в него пишутся данные. SerialPortMonitir'ом смотрю что происходит в СОМ.
 В одной программе все работает нормально. скопировал все функции в другую, открытие и конфигурирование проходят нормально, при попытке послать данные
 WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
 BytesWritten = 0, данные не одут. В чем может быть дело?
 
|  |   Вопрос задал: AlexMPEI (статус: 1-ый класс)Вопрос отправлен: 31 августа 2009, 10:52
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 12; последнее сообщение — 8 сентября 2009, 10:46; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 31 августа 2009, 11:14 [#1]:делфи 2009? То, что открытие происходит хорошо, ещё ничего не значит. Порт может неверно сконфигурирован к примеру. Надо не просто "скопировать", а "сличить" в portMonitor.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 31 августа 2009, 12:31 [#2]:delphi 7. в SerialPortMonitor нашел 2 отличия: 1) для установки скорости везде использую одинаковый код
 
 if not GetCommState(ComFile, DCB) then
 Result := False;
 
 Config := 'baud=600 parity=n data=8 stop=1';
 
 if not BuildCommDCB(@Config[1], DCB) then
 Result := False;
 хекс значения в команде SetBoudeRate SerialMonitor'a почему-то разные.
 
 2) установка таймаутов:
 
 with CommTimeouts do
 begin
 ReadIntervalTimeout         := 0;
 ReadTotalTimeoutMultiplier  := 0;
 ReadTotalTimeoutConstant    := 10000;
 WriteTotalTimeoutMultiplier := 0;
 WriteTotalTimeoutConstant   := 1000;
 end;
 
 if not SetCommTimeouts(ComFile, CommTimeouts) then
 Result := False;
 
 опять код один, но хекс-значения SerialMonitor'a почему-то разные.
 |  
|   | Вадим К (статус: Академик), 31 августа 2009, 12:57 [#3]:так. две программы, написанные Вами, работают с одним и тем же устройством, используют один код, скомпилированные одним компилятором, но выдают разные результаты??? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 31 августа 2009, 13:35 [#4]:совершенно верно. на одном компьютере, обе на Delphi7, все функции одинаковы до букв, используют один порт с одинаковыми параметрами, но в итоге одна действительно работает, а другая не пишет в порт и SerialMonitor показывает что устанавливаемые скорость и таймауты разные, хотя в программах задаются одинаковые значения |  
|   | Вадим К (статус: Академик), 31 августа 2009, 14:42 [#5]:Очень странно. а случайно их не параллельно запускаете? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 31 августа 2009, 15:34 [#6]:нет, конечно по очереди. иначе у меня порт бы не открывался у другой программы |  
|   | Вадим К (статус: Академик), 31 августа 2009, 16:41 [#7]:Тогда осталось сделать ещё один вариант. создать ещё третью программу... а потом думать. что то мне кажется, что где то есть не инициализированная переменная. Например тот же DCB. Не инициализированная переменная - это наиболее адекватное объяснение сложившейся ситуации. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 31 августа 2009, 18:08 [#8]:сделал 3е, повторив первое работающее. 3, как и 2е, не работает  та же самая ситуация с настройками. а первое продолжает нормально работать... Есть у кого работающий пример с функциями открытия, конфигурации и посылки в ком-порт? |  
|   | Вадим К (статус: Академик), 31 августа 2009, 18:31 [#9]:Ну раз первый работает... Как повторяете? просто копируете проект или копипастом код переносите? Может всё таки что то не копируется? неинициализированные переменные? (я в них верю в данном случае)
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 4 сентября 2009, 12:35 [#10]:Создаю новый проект, добавляю контролы, копипастом переношу функции работы с компортом, код обработчиков и вар. Просмотрел тщательно - копирую все. Что может быть не инициализировано? Кроме DCB и CommTimeouts мне кажется ничего не может повлиять. DCB инициализирую через GetCommState, выходит с тру. CommTimeouts тоже забиваю.
 |  
|   | Вадим К (статус: Академик), 4 сентября 2009, 13:39 [#11]:компоненты. у них ведь тоже есть свойства. Мало какие там компоненты. Кстати, комопоненты с формы можно тоже копипастом переносить - просто выделяем и Ctrl+C. Копируются и установленные для них свойства. код вида
 
 if not GetCommState(ComFile, DCB) then
Result := False;лучше заменить на 
 if not GetCommState(ComFile, DCB) then
begin
  Result := False;
  Exit;
end;Давайте начнем так, сравните два лога открытия порта и найдите первые различия, выложите оба лога (не нужно вставлять разные служебные символы), а также какими параметрами инициализируете (если они отличаются от указанных выше) - будем пробовать угадать, что не так. 
 паралельно, попробуйте ещё одну библиотеку для работы с ком портом - SynaSer (брать здесь http://www.ararat.cz/synapse/doku.php/download). Но у них есть одна "специфическая особенность" - они работают в блокирующем режиме. Поэтому оптимальная работа с ними будет в отдельном потоке. В свое время я их использовал - осталось приятное впечетление. В тот момент, как половина компонентов для работы с ком портом не хотело подключаться, эта библиотека сразу подключилась.
 
 Но еще раз пишу, это библиотека, а не компонент
  но там есть примеры... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 8 сентября 2009, 10:46 [#12]:сделал 4е приложение, подключив к нему файл из работающего проекта и удалив оттуда все лишнее - работает. Подключил этот файл к текущему проекту - работает!  я так и не нашел отличий, но факт остается фактом. Так что, думаю, вопрос закрыт. Хотя как будет время попробую все же найти причину - интересно. Спасибо. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |