GlukSoft
Главный специалист
Offline
Пол:
|
|
« : 08-04-2005 09:53 » |
|
Разрабатываемые нами платы работают по RS 485 в режиме полудуплекса (два провода 1 TX- и 2 TX+), до этого работали с платой Advantech PCI-1602B и никаких проблем небыло, данные нормльно уходили и приходили, плата сама определяла направление передачи. Сейчас понадобилась плата для ноутбука, купили Advantech COMpad-85B2 в документации написано, что по двум проводам работает, воткнули не пошло. Стали копать, нашли в FAQе на сайте производителя, что надо соединить TX- c RX- и RX+ с TX+ ,управлять RTSом и игнорировать эхо во время посылки данных. Ладно сделали: контакты соединили, перед посылкой устанавливаю RTS сразу опосля очищаю, данные уходят (плата реагирует на команды как надо), эхо приходит, а вот вместо данных, которые должна выдавать плата, приходит черт знает что, то есть длинна совпадает, а вот данные нет. Что с этим делать и в каком направлении копать?
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 08-04-2005 21:36 » |
|
GlukSoft, режим fullduplex или halfdupulex должен быть одинаковым с обеих концов. Железо так же должно поддерживать нужный режим. Если не ошибаюсь, half - RS-422, full - RS-485. Давно было - не помню.
Или я не понимаю в чем вопрос? Тогда поясни, пожалуйста, понятнее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
xelos
Гость
|
|
« Ответ #2 : 10-04-2005 12:40 » |
|
я с Advantechовскими модулями ADAM работал (к сетке RS485 подключался через ADAM 5060, вроде, который интерфейс USB/RS485) - никаких проблем замечено не было ни на портабельном, ни на десктопе. из программы с модулями работал как с обычным COM портом - никаких заморочек. попоробнее про то, что надо сделать напиши.
|
|
|
Записан
|
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #3 : 11-04-2005 04:11 » |
|
RXL, поллудуплекс реализуется и на 485, для того чтобы на одну линию вешать несколько устройств, я так понял, что нормальный полудуплекс на PCMCIA карточке не реализован, поэтому они просят соединить вход с выходом, а приемом-передачей управлять RTS-ом, собственно из-за замкнутых входа и выхода и приходит эхо во время посылки, вопрос в том, почему данные из устройства приходят правильные по длинне, но не правильные по содержанию. Помучили еще плату, стали увеличивать задержку на отсылку данных нашим устройством, получилось оригинально: при увеличенной задержке первые два байта - бред, остальные нормальные, если еще увеличить задержку, то первый байт бред, остальные нормальные. Вроде надо было бы еще увеличить задержку, но если повторять команду подряд пять раз, то в первом случае все пять ответов примерно одинаковые (два - бред с вариациями, остальные нормальные), а во втором случае три одинаковых ответа (по идиотизму), а последние два вообще фигня (зацикленные последние три байта). xelos, так дело в том, что у тебя один и тотже ADAMчик, а у нас две разные платы PCIная и PCMCIAная. С портом я действительно работаю как с обычным COM портом, проблема из-за того, что в PCMCIAном варианте не реализован полудуплекс, и они предлагают подобный изврат. Соответственно вопрос, как с этим бороться?
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Alf
Гость
|
|
« Ответ #4 : 11-04-2005 06:18 » |
|
А в полном дуплексе проверял? Если изолировать прием и передачу, сообщения приходят нормально?
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #5 : 11-04-2005 06:31 » |
|
GluckSoft! Есть еще такой нюанс. RTS нужно переключать после ухода из порта последнего бита и не раньше, а это событие определяется очисткой двух битов в регистре состояния линии по адресу BaseAddr+5 (регистр должен перейти из $60 в 0). Как правило, стандартный драйвер Com-порта либо не отслеживает это событие, либо делает это криво.
|
|
|
Записан
|
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #6 : 11-04-2005 07:22 » |
|
Alf, в полном дуплексе все нормуль, но он нам на ... не нужен. Серж, посмотрю внимательнее, но насколько я помню, отсылку последнего байта я отслеживаю.
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Alf
Гость
|
|
« Ответ #7 : 11-04-2005 07:28 » |
|
Я просто на предмет удостовериться, все ли там в приемнике нормально.
Если по-хорошему не получается, то не спасет ли диффсистема отцов русской демократии? Вроде не такая уж дорогая вещь, и процесс управляемым станет.
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #8 : 11-04-2005 07:32 » |
|
GluckSoft! Не последнего байта, а именно последнего бита последнего байта. Аппаратное прерывание выдается как раз в начале ухода последнего байта.
|
|
|
Записан
|
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #9 : 11-04-2005 10:36 » |
|
Серж, ладно, гляну. В ник букву c необязательно вставлять
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Серж
Гость
|
|
« Ответ #10 : 11-04-2005 14:21 » |
|
GlukSoft, больше не буду. А еще возможен вариант, что переключение RTS происходит слишком поздно, т.е. железяка слишком быстро отвечает на твой запрос и происходит сдвиг данных
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 11-04-2005 18:27 » |
|
GlukSoft, не пробовал осцилографом проверить? Если подобрать периодичность посылка-пауза, то картина может стать видимой. Мне кажется, что тут дело в искажении сигнала - похоже на влияние реактивной нагрузки.
Alf, а разве RS485 и так не работает с дифференциальной линией? Или ты о чем?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Alf
Гость
|
|
« Ответ #12 : 11-04-2005 21:02 » |
|
Alf, а разве RS485 и так не работает с дифференциальной линией? Или ты о чем? Нет, я немного о другом. Имею в виду дифференциальную систему, при помощи которой связисты превращают 4-проводные линии в 2-проводные и наоборот. Этакий 6-полюсник, у которого есть вход, выход и линия. То, что подается на вход диффсистемы, уходит в линию. То, что приходит с линии, подается на выход диффсистемы. При этом развязка между входом и выходом довольно хорошая. Таким образом, кстати, в телефонии давят локальное эхо, чтобы сигнал с микрофона не глушил говорящего, а заодно и с самовозбуждением борются, ведь акустическая связь микрофона и телефона обычно неслабая. Такая штука позволит полностью развязать вход и выход интерфейса и разобраться с ними по отдельности. Иначе не поймешь, кто портит сигнал (и портит ли), когда все включено параллельно. А так можно и осциллографом стать на вход, поглядеть, что там творится. А еще лучше - сварганить преобразователь в RS-232 и подключить параллельно заведомо исправный комп в режиме эмуляции терминала, поглядеть, что там передается/принимается. А то вслепую гадать долго придется.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #13 : 11-04-2005 21:20 » |
|
кстати, насчет эмулятора - если прога работает с карточкой как с обычным ком портом, есть полезная утилитка - PortMon называется, от SystemInternals, она позволяет проанализировать все операции с портом (до битового уровня не доходит, но показывает как и когда конфигурируется порт и что отправляется и принимается). Меня много раз уже выручала.
|
|
|
Записан
|
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #14 : 12-04-2005 03:53 » |
|
Спасибо всем. С ручным переключением RTS я зае..., но получил результаты получше, т.е. довел процент развала посылок до 6. Потом вспомнил рекомендации типа RTFM, и откопал, если поставить dcb.fRtsControl = RTS_CONTROL_TOGGLE, то после ухода последнего бита RTS переключается на прием, и все пошло .
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 12-04-2005 21:33 » |
|
Таки, физически, в чем была причина, осталось не известно*
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #16 : 13-04-2005 03:53 » |
|
RXL, угу, лень было брать цифровой осцил, читать к нему инструкцию, MSDN всетаки роднее
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Серж
Гость
|
|
« Ответ #17 : 13-04-2005 06:24 » |
|
Очевидно, что причина в том, что не вовремя переключался RTS, либо слишком рано, либо слишком поздно. Кстати, автоматическое переключение RTS, которое в конце концов помогло, помогает не всегда, особенно для плат, которые отвечают слишком быстро. Я использовал стандартный дравер Com-порта в Win2000 с автоматическим переключением RTS для платы, которая отвечала в течение одной миллисекунды после команды, и это не помогало, работал только ручной способ.
|
|
|
Записан
|
|
|
|
|