| 
			| 
					
						| 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=225 2. 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] |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	|  |