spasitel
Гость
|
|
« : 27-01-2009 13:56 » |
|
Здравствуйте.
Ребята, подскажите, пожалуйста, как правильно программировать COM порт по протоколу RS-485? На что нужно обратить внимание какие отличия у него от RS-232? Какие функции API можно использовать для работы с ним?
Уже замучился..хочу разобраться как правильно работает вся эта "каша". В итоге у самого в голове стала каша..Мне нужно опрашивать контролер управления мельничным комплексом...
Буду благодарен за подсказки и рекомендации.. Извините, если что-то не так изложил. Я пока только пробую с ним работать.
Всем удачи!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 27-01-2009 14:45 » |
|
1. порт(485) в компе есть? Подозреваю что нету. 2. Работает также как и работа с ком портами 3. Нужен адаптер 485-232.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #2 : 27-01-2009 16:49 » |
|
В случае внешнего конвертера RS232<->RS485 различия могут быть только для двухпроводных версий. В этом случае какой-то из управляющих сигналов RS232 используется для переключения режима приема/передачи. В случае четырехпроводного интерфейса разницы нет.
Различия есть в протокольной части, т.к., в отличии от RS232, RS485 позволяет подключать несколько ведомых устройств на одну шину, но это выходит за рамки управления интерфейсом.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
spasitel
Гость
|
|
« Ответ #3 : 02-02-2009 08:38 » |
|
Привет собратьям , которые откликнулись! Критику приветствую потому, что она позволяет посмотреть на свои ошибки со стороны... Плата с RS-232 на RS485 адаптер есть, соединение с контролером двухпроводное.. 1.Подскажите, пожалуйста, какие апишные функции использовать, для установления паритета (MARKPARYTY,SPACEPARITY,...).Я меняю их с помощью перенастройки структуры DCB. Смеяться с моих ошибок разрешаю.Ругаться тоже можна, только не очень сильно.. 2.Если я правильно понял, в этом протоколе(RS-485) нужно использовать переключение между посылкой данных и приемом. ДЛя этой цели использую API EscapeCommFunction(hport, CLRDTR) и EscapeCommFunction(hport, SETDTR) Вообще вопрос выглядит так, нужно контролеру послать входной управляющий пакет 1-ый байт - Адрес приемника #3 2-ый байт - Код команды #2 (возвратить статус устройства) 3-ый байт - Контрольная сумма #5 4-ый байт - Байт конца пакета #0 Структура байта - 9-битовая. В байте адреса приемника и байте конца пакета 9-ый бит=1(адрес), в остальных - 0(данные) контрольная сумма вычисляеться простым сложением всех байтов пакета без учета переноса Байт конца пакета равен 0 Байты данных тоже будут посылаться контролеру в пакете. Меня пока интересует хотябы получить хоть какой-то ответ от контролера ,а то вообще гад не хочет "говорить" со мной... Помогите найти ошибки, пожалуйста!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 02-02-2009 17:09 » |
|
1. Лениво. Посмотри статью (она из-за длины разбита на две части) - там все есть об управление портом: https://club.shelek.ru/viewart.php?id=208https://club.shelek.ru/viewart.php?id=2252. RS-485 - не протокол, а электрический интерфейс! А вот по нему уже пускают данные. Когда просто поток байтов не устраивает, придумывают протокол (правила обмена). Вообще, как-то непонятно ты пишешь. Если знаешь - делай, если что-то не получается - спрашивай (но конкретику). Не надо все в одну кучу сваливать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #5 : 03-02-2009 07:44 » |
|
spasitel, RXL прав, как-то не очень понятен вопрос. Если ты работаешь через переходник RS232-Rs485, то ты работаешь просто с RS232 и не важно что висит на нем (хоть переходник, хоть лампочки) работа с ним описана в МСДНе. А про RS-485. Попробуй начать с http://ru.wikipedia.org/wiki/RS-485 там в разделе "Ссылки" есть "RS-485 для чайников". Ну и походи по ссылкам, которые в той статье.
|
|
« Последнее редактирование: 03-02-2009 07:46 от Артем »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #6 : 03-02-2009 08:50 » |
|
я так понимаю что у парня в протоколе передачи 9-ти битовая посылка
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #7 : 03-02-2009 16:35 » |
|
Хм. В таком случае придется контролировать отправку данных, прежде чем менять бит четности: установил режим, отправил данные, дождался опустошения буфера и все заново.
spasitel, а чем вызвана такая сложность? Часом у тебя не 8051-совместимый чип на другом конце?
|
|
« Последнее редактирование: 03-02-2009 16:38 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
spasitel
Гость
|
|
« Ответ #8 : 05-02-2009 07:19 » |
|
Здравствуйте!
Спасибо за подсказки! На счет того, какой чит стоит не могу сказать потому, что и сам толком не знаю..Постараюсь узнать.. По пводу того, как изложил, извините! Уже более детально почитал инфу, теперь разницу улавливаю, вроде.. А что, этот чип требует особого подхода к передаче? В любом случае Ваши подсказки и рекомендации приму к сведению. Еще надеюсь на Ваши подсказки, как правильно двигаться вперед. Пока Всем СПАСИБО.
Андрей.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 05-02-2009 07:34 » |
|
spasitel, у МП серии 51, при асинхронной передачи, можно привязать еще один бит, так называемый - для межпроцессорного общения. Это хорошо, когда построена "одноранговая" сеть и каждый контроллер является и мастером и слейвом. Т.е МП при получении этого бита выставляет прерывание, что помогает не дергаться на каждый принятый байт в сети. Подробности - в описании МП51. а протокол обмена очень стремный Вообще вопрос выглядит так, нужно контролеру послать входной управляющий пакет 1-ый байт - Адрес приемника #3 2-ый байт - Код команды #2 (возвратить статус устройства) 3-ый байт - Контрольная сумма #5 4-ый байт - Байт конца пакета #0
а если Контрольная сумма равна байту конца пакета? А если длина пакета фиксированная, то зачем признак конца пакета. Подсчет контрольной суммы - бред. Что он защитит/покажет? в таком случае применяются более надежные методы, например CRC16.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
spasitel
Гость
|
|
« Ответ #10 : 05-02-2009 07:57 » |
|
SLA, я понимаю что протокол стремный..тот, кто его писал давно слинял с моей канторы, а мне вот осталасось наследие.. Я так новичок в этой теме, да и еще никак не могу добиться от этого контролера хоть какого-то ответа. ТО ли я тупой, то ли в самом деле тут такое намутили.. Ты извини, я еще не все термины улавливаю, что ТЫ с Ребятами используешь для объяснения. Я все же стараюсь разобраться..
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #11 : 05-02-2009 08:05 » |
|
spasitel, ничего страшного - ты спрашивай.
На первом этапе - ты не добивайся получить ответ от контроллера. Послушай сеть. Посмотри бегающие пакеты. Возможны варианты. Контроллер является мастером(master). И ему пофиг что творится в сети. Контроллер является слейвом(slave). Тогда он должен иметь "сетевой адрес". Контроллер и мастер и слейв.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
spasitel
Гость
|
|
« Ответ #12 : 05-02-2009 08:20 » |
|
Извини ,что наверное мешаю, но как посмотреть бегающие пакеты? Ты имеешь в виду соединить два компорта и запустить две проги ,которые будут обмениваться инфой? "Сетевой адрес" мой контролер имеет(#3). По крайней мере я к нему обращаюсь по такому адресу и в документации так указано...
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 05-02-2009 08:32 » |
|
посмотреть пакеты? Ты уже подключен к 485-й сети? Тогда просто читай из компорта данные и анализируй. Вот не помню я, как будет себя вести система с девятым битом... Т.е. твоя задача получить из своей проги сниффер компорта.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
spasitel
Гость
|
|
« Ответ #14 : 05-02-2009 08:49 » |
|
Подключил к компорту адаптер 232<->485 . Далее к адаптеру подключен контролер по двухпроводной линии. Посылаю контролеру входной управляющий пакет. Жду ответа от него, читая данные, хоть какие-то, которые дылжны приходить на вход COM порта. Но, к сожалению, вообще ничего нет. Индикатор входных данных, что на контролере, что на плате-адептере не мигает. Он, индикатор, ведь должен мигать, если хоть любые данные контролер возвращает!? При отправке данных на контролер индикатор мигает. Да, что такое "сниффер компорта"?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 05-02-2009 08:57 » |
|
Та не торопись с отправкой. Читай ком порт. Добейся каких-то данных со своего адаптера. Может проблема в адаптере, може адаптер не настроен на нужную скорость. Может...
сниффер - это такая хрень, которая слушает сеть и принимает в себя все входящие пакеты
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
spasitel
Гость
|
|
« Ответ #16 : 05-02-2009 09:01 » |
|
Ладно, буду добиваться хоть каких-то данных ... А сниффера у меня нет, к сожалению..
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 05-02-2009 09:06 » |
|
spasitel, так я тебе предлагаю, что ты сам напишешь отой сниффер. Один из методов отладки Два компа На своем запускаешь свою прогу, на другом гипертерминал даже модно сеть послушать - просто подключиться к комппорту через гипертерминал. Если данные получаешь - электрическая часть исправна.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
spasitel
Гость
|
|
« Ответ #18 : 05-02-2009 09:19 » |
|
Сниффер я не напишу, покрайней мере не сейчас...возможности и знания не те... А что такое гипертерминал? Електрическая часть вроде исправна..У меня есть программка, для тестирования данного контролера. контролер с ней работает, обмениваеться данными. Скорость конечно только одна - 19200 и никакая другая более. И исходник вроде есть. Я по нему смотрел..вроде все более менее понятно, но у меня все равно не работает..Там он делает так(процедура отправки) : function SendRecieveStr(sAdr, sCmd: string):string; const iWait=0; var Str: string; i : integer; begin with fmUnitUtils do begin ComPort.SetRTS(False); ComPort.Parity.Bits := prMark; ComPort.WriteStr(sAdr); { ComPort.Parity.Bits := prSpace; !!!!! можно подумать} for i := 1 to Length(sCmd) do begin ComPort.WriteStr(sCmd[i]); ComPort.Parity.Bits := prSpace; end; ComPort.WriteStr(#0); ComPort.Parity.Bits := prMark; ComPort.WriteStr(#0);
ComPort.SetRTS(True); ComPort.ReadStr(Str,50); end; Result := Str; end;
Я хочу сделать с помощью апишных функций, не используя компонент. Разобраться хочеться самому... Вот и застрял, не могу все в одно сложить, понять как эта система работает...
|
|
« Последнее редактирование: 05-02-2009 09:28 от spasitel »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #19 : 05-02-2009 09:24 » |
|
spasitel, оформляй код тегами [code][/code]
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|