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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 140

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

Доброго времени суток, уважаемые эксперты!
Работаю с COM портом. в программе открывается СОМ1, настраивается и в него пишутся данные. SerialPortMonitir'ом смотрю что происходит в СОМ.
В одной программе все работает нормально. скопировал все функции в другую, открытие и конфигурирование проходят нормально, при попытке послать данные
WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
BytesWritten = 0, данные не одут. В чем может быть дело?

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

Вопрос задал: AlexMPEI (статус: 1-ый класс)
Вопрос отправлен: 31 августа 2009, 10:52
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 12; последнее сообщение — 8 сентября 2009, 10:46; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 31 августа 2009, 11:14 [#1]:

делфи 2009?
То, что открытие происходит хорошо, ещё ничего не значит. Порт может неверно сконфигурирован к примеру. Надо не просто "скопировать", а "сличить" в portMonitor.
Галочка "подтверждения прочтения" - вселенское зло.
AlexMPEI

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

AlexMPEI (статус: 1-ый класс), 31 августа 2009, 13:35 [#4]:

совершенно верно. на одном компьютере, обе на Delphi7, все функции одинаковы до букв, используют один порт с одинаковыми параметрами, но в итоге одна действительно работает, а другая не пишет в порт и SerialMonitor показывает что устанавливаемые скорость и таймауты разные, хотя в программах задаются одинаковые значения
Вадим К

Вадим К (статус: Академик), 31 августа 2009, 14:42 [#5]:

Очень странно. а случайно их не параллельно запускаете?
Галочка "подтверждения прочтения" - вселенское зло.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 31 августа 2009, 15:34 [#6]:

нет, конечно по очереди. иначе у меня порт бы не открывался у другой программы
Вадим К

Вадим К (статус: Академик), 31 августа 2009, 16:41 [#7]:

Тогда осталось сделать ещё один вариант. создать ещё третью программу... а потом думать. что то мне кажется, что где то есть не инициализированная переменная. Например тот же DCB. Не инициализированная переменная - это наиболее адекватное объяснение сложившейся ситуации.
Галочка "подтверждения прочтения" - вселенское зло.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 31 августа 2009, 18:08 [#8]:

сделал 3е, повторив первое работающее. 3, как и 2е, не работает :( та же самая ситуация с настройками. а первое продолжает нормально работать... Есть у кого работающий пример с функциями открытия, конфигурации и посылки в ком-порт?
Вадим К

Вадим К (статус: Академик), 31 августа 2009, 18:31 [#9]:

Ну раз первый работает...
Как повторяете? просто копируете проект или копипастом код переносите? Может всё таки что то не копируется? неинициализированные переменные? (я в них верю в данном случае)
Галочка "подтверждения прочтения" - вселенское зло.
AlexMPEI

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

AlexMPEI (статус: 1-ый класс), 8 сентября 2009, 10:46 [#12]:

сделал 4е приложение, подключив к нему файл из работающего проекта и удалив оттуда все лишнее - работает. Подключил этот файл к текущему проекту - работает! :) я так и не нашел отличий, но факт остается фактом. Так что, думаю, вопрос закрыт. Хотя как будет время попробую все же найти причину - интересно. Спасибо.

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

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