Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

Опять serial порт...   Найти похожие ветки 

 
bg8 ©   (2005-12-09 20:47) [0]

Доброго времени суток, Мастера!

Извиняюсь сразу, вопрос собственно не то чтобы о Delphi, а философский...

Проблема в следующем. Есть некий девайс, который умеет общаться с компьютером при помощи интерфейса RS485. Есть WinXP, и переходник USB<->RS485. При подключении переходника в системе просто появляется еще один COM порт. Пусть будет COM3. Т.о. казалось бы, очень просто общаться с девайсом. НО. Девайс принимает команду в следующем формате:

1й байт - адрес устройства в сети RS485 (в данном случае пусть будет 1)

2й байт - кол-во байтов в пакете, исключая первый и второй

3й байт - код команды (команда - это один символ/байт)

У команды может быть некоторое кол-во параметров - от 2-х до 4-х байт

Последний байт - контрольная сумма.

Ну так вот, девайс реагирует только на команду, адресованную ему, если он знает этй команду и если контрольная сумма правильная. В противном случае он просто молчит. Если команда им распознана, то он отвечает на нее в таком же формате,  единственное что меняется - это значение и кол-во параметров.

Теперь к делу (извините за объемность текста, но все по делу помоему). под винду девайс реагирует только на две самых простых команды  - команды эти без параметров, и никаких параметров в ответ на эти команды девайсу возвращать не надо (это "ПУСК" и "СТОП"). Т.е. в ответ на эти команды он просто возвращает те же 4 байта, которые ему посылаешь, и включается (выключается). Ни на какие другие команды, которые требуют выхода за 4-х байтную границу, прибор не реагирует. (Я не утверждаю, что дело в числе 4, но сие есть экспериментальный факт.)

Есть тестовая программулька под ДОС, она требует чтоб был преобразователь COM в RS485 и висел он на COM2. Если загрузиться в ДОСе, то девайс на все команды отвечает адекватно, все работает зашибись. Думал, что дело в USB-конвертере, но нет, под винду повесил этот же конвертер COM в RS485, который работал в ДОСе, в винде все то же самое, что и с USB.

В описании этой программульки есть фраза, что "управление направлением передачи данных порта осуществляется с помощью сигнала RTS". Преобразователь интерфейса, что один, что другой, умеют аппаратно управлять направлением передачи данных. А в исходниках тестовой программульки есть такой кусочек: (программка на C, извините, на паскале нету:) )

(я по памяти пишу, поскольку все осталось на работе, попозже могу поточнее написать)

void outchar(int out){
outportb(COM+4,2);
outportb(COM,out);
while(!(inportb(COM+5)&64)) outportb(COM+4,0);
outportb(COM+4,2);
}


а переменная COM определена как 0х2F8 (ну в общем, адрес 2-го ком порта - тоже точно не помню).

В общем, я отчаялся добиться работы девайса под винду,

ай нид хелп!!

Заранее спасибо!


 
bg8 ©   (2005-12-09 21:45) [1]

Не понимаю, чего в моем вопросе от конференции "начинающим"... Все бы были такими начинающими, как я...


 
Джо ©   (2005-12-09 21:49) [2]


>  [1] bg8 ©   (09.12.05 21:45)
> Не понимаю, чего в моем вопросе от конференции "начинающим"...

Цитирую текст вверху страницы форумов:
Если Вам не хватает знаний и Вы затрудняетесь четко сформулировать вопрос, просьба размещать его в специальной конференции "для начинающих".
Ваш вопрос, насколько я понял, сводится к словам: "В общем, я отчаялся добиться работы девайса под винду". Ну, и что здесь можно конкретного сказать, если даже "девайс" не озвучен?


 
bg8 ©   (2005-12-09 21:54) [3]

Ну ткнули носом, ну согласен,  ну извините))


 
bg8 ©   (2005-12-09 22:00) [4]

Вряд ли озвучивание "девайса" поможет Мастерам ответить на вопрос... Но если желаете... Пжалуйста... "Девайс" - импульсный источник высокого напряжения ИПЭИ-60, выдает в импульсе от 20 до 60 кВ, макс. частота следования импульсов 10 Гц, длительность импульса - 15 мс, создан в Институте Прикладной Физики РАН, где я собственно и учусь/работаю. Ну что, легче стало? ))

RS485 позволяет считывать и устанавливать значения внутреннего ЦАП/АЦП, т.е. измерять напряжение на выходе неконтактным( прямым) способом, что позволяет избавиться от всяких высоковольтных шунтов, делителей и пр. А исчо есть такие полезные команды у него как пуск и стоп...


 
bg8 ©   (2005-12-09 22:05) [5]

А про себя я не хвастаюсь... просто уж давнооо... я вроде как программер... а вот с такими вещами первый раз столкнулся... и не знаю че делать... понимаю, что дело вроде именно в контроле за направлением передачи... как собачка... все понимаю, а сказать не могу...


 
Джо ©   (2005-12-09 22:19) [6]

Я в этом деле не специалист, но что мешает основательно разобрать ту самую работающую "досовскую программу", особенно на предмет установки параметров работы порта?


 
bg8 ©   (2005-12-09 22:23) [7]

Ну так блин, разобрал конечно, ничего (!) там нету такого, чего бы я не сделал... скорость 9600, четности нету, стопбит 1, биты данных 8 бит... вот тот кусоче кода, кот. я привел, мне покоя не дает... т.е. это как раз установка RTS, но че происходит с сигналами управления портом, когда на нем висят умные переходники, которые "реализуют аппаратное управление направлением передачи"?!


 
tesseract ©   (2005-12-10 12:09) [8]


> Ну так блин, разобрал конечно, ничего (!) там нету такого,
>  чего бы я не сделал... скорость 9600, четности нету, стопбит
> 1, биты данных 8 бит... вот тот кусоче кода, кот. я привел,
>  мне покоя не дает... т.е. это как раз установка RTS, но
> че происходит с сигналами управления портом, когда на нем
> висят умные переходники, которые "реализуют аппаратное управление
> направлением передачи"?!


Зависит от умных переходников. RS485 всё таки от rs232 отличается. CTS/RTS там , если память не изменяет нет.


 
GanibalLector ©   (2005-12-10 12:39) [9]

Поставь PortMon и смотри за передачей/приемом.

З.Ы. И еще...я работал примерно по такому протоколу,но с другим устройством.Так вот,после посылки команды "старт" у меня требовалось переинициализировать порт(на другую четность).Описание протокола хоть есть???


 
Набережных С. ©   (2005-12-10 17:04) [10]


> bg8 ©

Раз некоторые команды выполняются, то проблема, имхо, в протоколе обмена. Я бы подключил к линии логический анализатор( при наличии оного:)) и посмотрел, как досовская программа обменивается. А если анализатора нет, то подходящий для данного случая несложно из компьютера сделать. Ну или FileMon, как уже посоветовали, если получится.


 
GEN++ ©   (2005-12-10 17:17) [11]

>bg8 ©
Поставь в свойствах Comm порта в разделе
"Управление потоком" значение "Аппаратное" или "HardWare"
и будет тебе счастье. Если же оного не случится
то скинь мне всю инфу, какая есть, по этому вопросу на мое мыло =>
попробую помочь (с RS-485 я денно и нощно занимаюсь).


 
Германн ©   (2005-12-11 00:28) [12]

2 bg8 ©   (09.12.05 20:47)
Сразу смущает нестыковки в объяснении сабжа:

> В описании этой программульки есть фраза, что "управление
> направлением передачи данных порта осуществляется с помощью
> сигнала RTS". Преобразователь интерфейса, что один, что
> другой, умеют аппаратно управлять направлением передачи
> данных. А в исходниках тестовой программульки есть такой
> кусочек: (программка на C, извините, на паскале нету:) )
>
> (я по памяти пишу, поскольку все осталось на работе, попозже
> могу поточнее написать)
>
> void outchar(int out){
> outportb(COM+4,2);
> outportb(COM,out);
> while(!(inportb(COM+5)&64)) outportb(COM+4,0);
> outportb(COM+4,2);
> }


Но, если я стелепировал правильно, то ты зря полагаешься на "Преобразователь интерфейса, что один, что
> другой, умеют аппаратно управлять направлением передачи
> данных." Фрагмент программы ясно показывает, перед передачей данных программа устанавливает RTS, а при приеме опять же именно программа RTS снимает. Чего ИМХО ты в своей Win-программе не делаешь!


 
YurikGL ©   (2005-12-11 01:30) [13]

А кто сказал, что в RS-232 нет RTS CTS ??? Если включить аппаратное управление потоком, эти сигналы сами должны выставляться. Их суть в том, что они показывают готовность порта к приему и передаче данных. По крайней мере, стандарт на RS-232C это предусматривает. Т.е. если данный интерфейс соответсвует RS-232C с аппаратным управлением потоком, то простое его включение должно решить проблему.
С другой стороны, никто не мешает использовать сигналы RTS/CTS под другие цели не соответствующие аппаратному управлению потока.


 
Германн ©   (2005-12-11 02:23) [14]

2 YurikGL ©   (11.12.05 01:30) [13]
> А кто сказал, что в RS-232 нет RTS CTS ??? Если включить аппаратное управление потоком, эти сигналы сами должны выставляться. Их суть в том,...

Имхо, к сабжу это не относится.


 
tesseract ©   (2005-12-11 20:31) [15]


>>Поставь PortMon и смотри за передачей/приемом.

Два компа соединяешь  Cross COM читаешь порт и смотришь что происходит.
Вариент GannibalLector с чётностью очень похож на реальность.

Ещё в догонку распайки всех упомянутых стандартов, может пригодится :

http://qnx.org.ru/index.php?option=com_minibb&action=vthread&forum=5&topic=76&page=1.html


 
Германн ©   (2005-12-12 01:51) [16]


> Теперь к делу (извините за объемность текста, но все по
> делу помоему). под винду девайс реагирует только на две
> самых простых команды  - команды эти без параметров, и никаких
> параметров в ответ на эти команды девайсу возвращать не
> надо (это "ПУСК" и "СТОП"). Т.е. в ответ на эти команды
> он просто возвращает те же 4 байта, которые ему посылаешь,
>  и включается (выключается). Ни на какие другие команды,
>  которые требуют выхода за 4-х байтную границу, прибор не
> реагирует. (Я не утверждаю, что дело в числе 4, но сие есть
> экспериментальный факт.)


2 GanibalLector ©   (10.12.05 12:39) [9]
2 tesseract ©   (11.12.05 20:31) [15]

Вам этого мало, чтобы понять , что вы не правы?

Если бы дело было в том, что "непереключена чётность", то "прибор" бы не выполнил бы никакую команду!
А ведь суть сабжа в том, что автор не получает ответ!


 
bg8 ©   (2005-12-12 11:13) [17]

Привет всем! Спасибо за ответы! Теперь постараюсь ответить на все вопросы.

1) Аппаратное управление потоком - первое, что я попробовал сделать. Результат, сами понимаете, нулевой.

2) Пробовал сам  программно ставить/снимать RTS после приема/перед передачей (т.е. наоборот :) ) Результат - см. пункт 1.

Приведу карткий кусочек описания протокола:
"Интерфейс RS485 предназначен для связи с персональным компьютером, скорость передачи - 9600 бод. .................... Любая команда и ответ на нее представляет собой последовательность байтов. Младший (нулевой) байт - номер устройства (1). Следующий - число байт в посылке без нулевого и первого. Второй байт - код команды (ответа)  - ASCII символ от A до Z. Далее могут идти до 5-ти байт параметров. Завершает посылку контрольная сумма."

Все, что известно про требования к аппаратной части - 9600 бод...


 
Германн ©   (2005-12-12 15:12) [18]

2 bg8 ©   (12.12.05 11:13) [17]
Аппаратное управление потоком тут как мертвому припарка. Винда же не знает, что такое RS485.


> 2) Пробовал сам  программно ставить/снимать RTS после приема/перед
> передачей (т.е. наоборот :) ) Результат - см. пункт 1.

Скорее всего не успеваешь сменить сигнал RTS перед приемом и теряешь ответ. В винде это не просто сделать, имхо.


 
bg8 ©   (2005-12-12 15:34) [19]

ИМХО, в RS485 вообще нету такого понятия, как управление направлением передачи... Поэтому "как мертвому припарка" не потому, что винда не знает, что такое rs485,  а потому, что rs485 наплевать на RTS.

Подключил линию к осциллографу. На две команды (те самые, кот. описаны в начале) девайс отвечает, на все другие - нет. Т.е. я не теряю ответ (а была такая мысль), его просто нету физически. Но осциллограф дал пищу для размышления... Я посылаю 4 байта в порт, а на выходе почему-то 5... Откуда берется пятый байт, я пока не понял.


 
bg8 ©   (2005-12-12 15:36) [20]

пятый байт, он на самом деле первый. Т.е. при изменении команды меняется на осциллографе все, кроме первых 8-ми битов


 
Германн ©   (2005-12-12 15:49) [21]


> ИМХО, в RS485 вообще нету такого понятия, как управление
> направлением передачи... Поэтому "как мертвому припарка"
> не потому, что винда не знает, что такое rs485,  а потому,
>  что rs485 наплевать на RTS.



> пятый байт, он на самом деле первый. Т.е. при изменении
> команды меняется на осциллографе все, кроме первых 8-ми
> битов


Как прикажешь тебя понимать, Саид? © "Белое солнце пустыни"


 
bg8 ©   (2005-12-12 15:57) [22]

Ну а че, я опять фигню сказал? ))

rs485 - два провода, дифференциальный сигнал -> нету никакого управляющего сигнала.

а про байты - посылка на выходе состоит из 5-ти байт, из которых первый - не знаю чего такое, а остальные 4 - это мои 4 байта.


 
bg8 ©   (2005-12-12 15:58) [23]

т.е. я шлю в порт 4 ьайта, а из порта в линию уходит какой-то загадочный байт, а потом мои 4


 
Германн ©   (2005-12-12 16:24) [24]


> rs485 - два провода, дифференциальный сигнал -> нету никакого
> управляющего сигнала.

Имхо, это управляющий сигнал для той микросхемы, которая в переходнике сидит.


> т.е. я шлю в порт 4 ьайта, а из порта в линию уходит какой-
> то загадочный байт, а потом мои 4
???


 
bg8 ©   (2005-12-12 16:32) [25]

переходник USB<->RS485. нечем управлять. нету никаких сигналов о направлении передачи, кроме наличия данных в буфере. ИМХО конечно.

а вот про лишний байт мне тоже очень интересно... может это виндузовый драйвер чевойто шлет по своему разумению?


 
Германн ©   (2005-12-12 16:38) [26]


> переходник USB<->RS485. нечем управлять. нету никаких сигналов
> о направлении передачи, кроме наличия данных в буфере. ИМХО
> конечно.
Ошибаешься.
>
> а вот про лишний байт мне тоже очень интересно... может
> это виндузовый драйвер чевойто шлет по своему разумению?
>

У драйверов своего разумения нет.


 
GEN++ ©   (2005-12-12 21:09) [27]

>bg8 ©
1. Я Вам предлагал на Email перейти: обсуждение явно выходит за "рамки"
темы форума => ветку могут в любой момент "прибить"
2. Что имеем в активе: обмен ведется пакетами
   в которых известно содержимое 1-го, 2-го байтов и которые обязательно
  терминируются однобайтной контрольной суммой
 Вопрос: "как считается КС" (весьма вероятно что это CRC8 или дополнение
 до 1). Пока не будет ответа на этот вопрос => дальнейшие эксперименты
 будут скорее всего уводить в сторону от решения.
 Я бы сделал так: соединил 2 Comm порта (RS232) нульмодемным кабелем
 и запустил DOS программу на одном, а к на ругом бы "Hyper Terminal" или
 еще лучше свою программу. Поскольку мастером на канале идет PC
 то на приемном конце будут получены запросы которые подлежат расшифровке.


 
Германн ©   (2005-12-13 02:56) [28]


> GEN++ ©   (12.12.05 21:09) [27]
>
> >bg8 ©
> 1. Я Вам предлагал на Email перейти: обсуждение явно выходит
> за "рамки"
> темы форума => ветку могут в любой момент "прибить"

Ну это перебор! Имхо, выход за рамки конференции "Начинающим", тут не предвидится.


> Вопрос: "как считается КС" (весьма вероятно что это CRC8
> или дополнение
>  до 1). Пока не будет ответа на этот вопрос => дальнейшие
> эксперименты
>  будут скорее всего уводить в сторону от решения.

По утверждению автора:
"Теперь к делу (извините за объемность текста, но все по делу помоему). под винду девайс реагирует только на две самых простых команды  - команды эти без параметров, и никаких параметров в ответ на эти команды девайсу возвращать не надо (это "ПУСК" и "СТОП"). Т.е. в ответ на эти команды он просто возвращает те же 4 байта, которые ему посылаешь, и включается (выключается)."

КС считается правильно, имхо, иначе прибор бы и не отвечал и (главное) не реагировал бы на "простую команду".


> Я бы сделал так: соединил 2 Comm порта (RS232) нульмодемным
> кабелем
>  и запустил DOS программу на одном, а к на ругом бы "Hyper
> Terminal" или
>  еще лучше свою программу. Поскольку мастером на канале
> идет PC
>  то на приемном конце будут получены запросы которые подлежат
> расшифровке.
>

Ты забыл, что тут RS485?


 
GEN++ ©   (2005-12-13 23:53) [29]

>Ты забыл, что тут RS485?

  Нет не забыл - соединяя 2 Comm через RS232 отсекаем преобразователи.
Протокол до сих пор не вскрыт. Алгоритм рассчета КС так же.
Почему не отвечает прибор?
1 в пакете не его адрес
2 контроллер не понимает формат запроса
3 не совпадает КС
4 "разбег скорстей" между PC и контроллером который начинает
   сказываться после 4-го байта.
мое IMHO - собака зарыта скорее всего в 2 и 3

Так что протокол обмен и алгоритм рассчета КС - в студию.

>rs485 - два провода, дифференциальный сигнал -> нету никакого
>управляющего сигнала.

Верно, сигнала нет, но есть время после последнего переданного байта
 от PC. Если оно >  времени передачи 3.5 байт на текущей скорости
 то преобразователь переключается с передачи на прием. Обратное
 переключение поисходит при попытке передать байт(ы)  данных от PC.

>а вот про лишний байт мне тоже очень интересно... может это
>виндузовый   драйвер чевойто шлет по своему разумению?

Где обнаружен этот байт? До преобразователя USB<=>RS485 или после?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.024 c
14-1133954121
Антоний
2005-12-07 14:15
2006.01.01
Печать на CD


14-1134047962
Kerk
2005-12-08 16:19
2006.01.01
Нашел в папке "Спам"


2-1134626798
pathfinder
2005-12-15 09:06
2006.01.01
Как заставить приложение реагировать во время выполнения задачи?


2-1134522939
SergP
2005-12-14 04:15
2006.01.01
Скрыть метод в наследнике


1-1133554079
FBI Agent
2005-12-02 23:07
2006.01.01
Автозагрузка в Безопасном режиме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский