Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение асинхронной передачи по COM-порту 
:(
    Опции темы
nayk
Дата 21.4.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2008
Где: Омск

Репутация: нет
Всего: нет



Добрый день.

Работаю с устройством по RS-232. Устройство сделано так, что для передачи ему пакета данных нужно устанавливать RTS=false, а для приема от него RTS=true.
Запись в порт происходит в асинхронном режиме. 

Каким образом можно узнать, что передан последний байт для взведения сигнала RTS?
PM MAIL WWW ICQ   Вверх
Felan
Дата 22.4.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Никаким. Ты пишешь в буфер порта. А из этого буфера передает уже драйвер порта. Можно попробовать поиграться с аппаратным контролем потока. Или настроить драйвер что бы он сам выставлял RTS/DTR. Но ты не сможешь указать ему что делать с этими сигналами. Можно только сказать, что они должны изменяться, а как именно он это будет делать (сбрасывать или взводить) написано в стандарте. Я точно не помню.
В делфи константы настройки управления этими сигналами объявлены неправильно. 
Вот я давно делал класс... его можно настроить что бы он дергал эти сигналы.
Вобщем для примера сойдет.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
nayk
Дата 22.4.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2008
Где: Омск

Репутация: нет
Всего: нет



Спасибо, посмотрю. У меня тоже свой класс для работы с портом. RTS взводит правильно, но на момент записи в порт его нужно убирать.

Пока не нашел ничего лучше задержки после записи в порт. Время задержки ставлю в зависимости от скорости порта и кол-ва записываемых байт:

Код

ComPort.SetRTS(false);
ComPort.Write(Buf, BufLength); // Buf: array of byte - пакет, BufLength - длина пакета
Sleep((BufLength+1)*ByteSpeed);
ComPort.SetRTS(true);


ByteSpeed - скорость записи одного символа в порт с учетом настроек.
Работает нормально. Пока оставлю так.
PM MAIL WWW ICQ   Вверх
Felan
Дата 23.4.2008, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Это ты сам его взводишь/убираешь. А должен это делать !САМ ДРАЙВЕР! т.к. у тебя нет возможности отследить все ли передалось в канал из внутреннего буфера драйвера или нет.

Твой вариант конечно имеет право на жизнь, но он все-таки неправильный. Если у тебя посылки идут редко, канал хороший, то будет работать, но все равно это потенциальный источник неустранимых проблем. Т.е. если у тебя большой проект, то потом, когда это аукнется, все может быть очень плохо.

В моем исходнике смотри все связанное с константами dcb_RtsControlDisable, dcb_RtsControlEnable, dcb_RtsControlHandshake. Ну и в MSDN посмотри, что они означают.



--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
nayk
Дата 23.4.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2008
Где: Омск

Репутация: нет
Всего: нет



Про RTSControl я знаю. По хорошему нужно установить RTS_CONTROL_TOGGLE. Тогда высокий уровень сигнала на RTS будет выставлен на время передачи. Но мне нужно наоборот - на время передачи низкий уровень, а такого режима в настройках нет.
PM MAIL WWW ICQ   Вверх
Felan
Дата 23.4.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



smile
Да... Это только инвертор ставить. Т.к. драйвер ведет себя так, как положено ему себя вести, если бы исползовался модем... Для другого не предназначен.
Это, мне кажется будет самое правильное.
Еще, из железных вариантов, сделать переходник, который будет возвращать эхо. Тогда сможешь по принятию полного эха определить момент, когда его нужно сбросить.

Почему-то у нас электронщики всегда делают наоборот :(.

Из нормальных программных средств... даже и не знаю, что можно применить. Попробуй почитать про event'ы, и overlapped режим... Может быть там что-то будет, тут я уже точно не знаю.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
nayk
Дата 23.4.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2008
Где: Омск

Репутация: нет
Всего: нет



Девайс такой собрали - преобразователь RS-232 <-> RS-485. Он вот так работает.
Через него подключено устройство, с которым нужно обмениваться данными.
Придется поднять вопрос по переделке адаптера начальству.  smile 

Ладно. Спасибо за помощь, Felan.

Это сообщение отредактировал(а) nayk - 23.4.2008, 13:28
PM MAIL WWW ICQ   Вверх
Felan
Дата 24.4.2008, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(nayk @  23.4.2008,  15:28 Найти цитируемый пост)
Девайс такой собрали - преобразователь RS-232 <-> RS-485. Он вот так работает.

Ага, я тоже когда-то занимался разработкой для таких девайсов... по MODBUSу работающих. У нас как раз переходник эхо возвращал.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.