Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как установить RTS_CONTROL_TOGGLE. Работа с RS-485


Kolan ©   (2005-07-14 16:02:00) 

Здравствуйте, {}
продолжая
  http://www.delphimaster.ru/cgi-bin/forum.pl?id=1121337022&n=0

REA   (14.07.05 14:41) [1]
RTS_CONTROL_TOGGLE Specifies that the RTS line will be high if bytes are available for transmission. After all buffered bytes have been sent, the RTS line will be low.
Windows Me/98/95:  This value is not supported.

устанавливается как fRtsControl в DCB

Ты хочешь RTS махать направлением передачи в RS485?


Да это я читал никак не врублюсь как дойти до этой DCB.
В Delphi есть TDCB и fRtsControl таи я ненашёл...
Мож у кого есть пример hf,jns c RS-485.

У меня есть переходник. RS-232 RS-485. Он(переходник) переданные на устройство данные возвращает назад. В принципе можно получив их назад сразу включать RTS, но кажется с RTS_CONTROL_TOGGLEвсё будет проше и правильней.

PS
 На самом деле первый раз с RS-485 работаю буду рад любой инфе, особенно в связке с Delphi.


wal   (2005-07-18 10:30:00) [1]


> Слышал я от некоторых людей, что применение флага RTS_CONTROL_TOGGLE
> может конфликтовать с буфером FIFO современными микросхемами
> UART! Так ли это?
Руки дойдут - потестирую, до сих пор пользовался EscapeCommFunction.

С уважением.


Германн   (2005-07-17 02:20:00) [2]

Может быть сабж уже и не актуален, однако попробую еще раз напомнить о своем ответе/вопросе Германн ©   (15.07.05 01:45) [3]

Слышал я от некоторых людей, что применение флага RTS_CONTROL_TOGGLE может конфликтовать с буфером FIFO современными микросхемами UART! Так ли это?
Может "тестировщица" об этом знает?


wal   (2005-07-15 12:13:00) [3]


> Еще вопрос как понять какой режим будет при fRtsControl1,
> fRtsControl2
> Зачем их два?
Из хелпа:
DWORD fRtsControl: 2 ; - то есть занимает два бита, а в множестве (set of) под каждый элемент отводится один бит.
Из Windows.pas:
RTS_CONTROL_TOGGLE = 3 - то есть для режима TOGGLE нужно установить оба бита, то есть : fl := [fBinary, fParity, fRtsControl1, fRtsControl2 ];

> Пока пробую сам перекльчать RTS. Неполучается ШОТО.
> Пред записью сбрасываю RTS так?
Незнаю, так у тебя или не так, но обычнопри записи его устанавливают.
А еще лучше посмотри, например с помощью PortMonitor'а, как это делает "плохо работающая" программа.

С уважением.


Kolan   (2005-07-15 11:56:00) [4]

О теперь дошло. Буду пробовать.

Еще вопрос как понять какой режим будет при fRtsControl1, fRtsControl2
Зачем их два?

Пока пробую сам перекльчать RTS. Неполучается ШОТО.

Пред записью сбрасываю RTS так?
 EscapeCommFunction(ComPort.ComPort, CLRRTS);
 ComPort.WriteByte(Ord('#'));
 ComPort.WriteByte(Ord('0'));
 ComPort.WriteByte(Ord('1'));
 ComPort.WriteByte(13);


Теперь сначала читаю эхо. Если оно как посылка то Включаю RTS.
Так?

Почемуто это принимаю а ответа устройства нет. Хотя устройство работает. Есть программа написанная другим человаком. Очень хреново написана, но работает и ответ читает. Жаль человек этот редко бывает...

Мож что нетак делаю?
begin

 S := '';
 S1 := '';
 S2 := '';

 repeat
   Sleep(100);
   A := ComPort.ReadByte;
   S := S + IntToStr(A) + ' ';
   S1 := S1 + Chr(A) + ' ';
   S2 := S2 + Chr(A);
   if S2 = '#01'+#13 then
     EscapeCommFunction(ComPort.ComPort, SETRTS);
 until A = 90;
 Result := S;
end;


wal   (2005-07-15 10:16:00) [5]


> Примерчик мож дадите.
fRtsControl ты там не найдешь, еще раз повторяю, это набор битов в структуре TDCB.
Я, обычно, использую что-то вроде этого:

type
 TDcbFlag= (fBinary,          // binary mode, no EOF check
            fParity,          // enable parity checking
            fOutxCtsFlow,     // CTS output flow control
            fOutxDsrFlow,      // DSR output flow control
            fDtrControl1,       // DTR flow control type
            fDtrControl2,       // DTR flow control type
            fDsrSensitivity,   // DSR sensitivity
            fTXContinueOnXoff, // XOFF continues Tx
            fOutX,            // XON/XOFF out flow control
            fInX,             // XON/XOFF in flow control
            fErrorChar,       // enable error replacement
            fNull,            // enable null stripping
            fRtsControl1,       // RTS flow control
            fRtsControl2,       // RTS flow control
            fAbortOnError,     // abort reads/writes on error
            fDummy1,
            fDummy2,
            fDummy3,
            fDummy4,
            fDummy5,
            fDummy6,
            fDummy7,
            fDummy8,
            fDummy9,
            fDummy10,
            fDummy11,
            fDummy12,
            fDummy13,
            fDummy14,
            fDummy15,
            fDummy16,
            fDummy17);
 TDcbFlags =  set of TDcbFlag;
...
var
 dcb: TDCB;
 fl : TDcbFlags;
begin
 fl := [fBinary, fParity, fRtsControl1, fRtsControl2];
 dcb.Flags := DWORD(fl);
 dcb.DCBlength := Sizeof(dcb);
...
 Result := SetCommState(hPort, dcb);
end;



С уважением.


Kolan   (2005-07-15 09:36:00) [6]


> wal ©   (14.07.05 17:08) [1]

485 2х проводной.
EscapeCommFunction
Это я нашел.
> так как существуют устройства, самостоятельно определяющие

Устройство грубо говоря самодельное этого неделает.


> Маг Похмеляйнен   (14.07.05 19:27) [2]
> >не врублюсь как дойти до этой DCB.
> использовать GetCommState() / SetCommState().


BOOL GetCommState(

   HANDLE hFile, // handle of communications device
   LPDCB lpDCB // address of device-control block structure
  );


Мож я слепой, тупой.  :)
Но в структуре TDCB я невижу fRtsControl.

Как и в _DCB. И в модуле Windows:
 TDCB = _DCB;
 DCB = _DCB;


Примерчик мож дадите.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 lpDCB: <Какой тип?>;
begin
 GetCommState(ComPort.ComPort, lpDCB);
 lpDCB.fRtsControl := RTS_CONTROL_TOGGLE;
end;


Благодару за ответы.


Германн   (2005-07-15 01:45:00) [7]

2 Маг Похмеляйнен   (14.07.05 19:27) [2]
> это точно. путь правильный. RTS будет устанавливаться >автоматом, во время передачи данных, специяльно контролировать >его не придётся.

Ты в этом уверен? Установки FIFO не будут мешать?


Маг Похмеляйнен   (2005-07-14 19:27:00) [8]

>не врублюсь как дойти до этой DCB.
использовать GetCommState() / SetCommState().
>с RTS_CONTROL_TOGGLE всё будет проше и правильней.
это точно. путь правильный. RTS будет устанавливаться автоматом, во время передачи данных, специяльно контролировать его не придётся.


wal   (2005-07-14 17:08:00) [9]


> Да это я читал никак не врублюсь как дойти до этой DCB.
> В Delphi есть TDCB и fRtsControl таи я ненашёл...
fRtsControl - это набор битов, который нужно установить во flags

> На самом деле первый раз с RS-485 работаю буду рад любой
> инфе, особенно в связке с Delphi.

В делфи работа с 485 от 232 почти ничем не отличается, за исключением нюансов.
Нюансы следующие. 485 может быть 2-х и 4-х проводным.
Для 2-х проводного обычно, существует такое явление, как "эхо", то есть " переданные на устройство данные возвращает назад". Но его может и не быть. Так же обычнотребуется при передаче сообщить об этом устройству, установив в сигнал RTS или DTR, а при окончании передачи его сбросить ("занять" линию, ибо 485 среда не 1-1, а N-N). Для установки сигнала можно использовать EscapeCommFunction, а можно и с настройками помудрить, типа того, что ты с RTS-ом сделать пытаешся. Но может и не обязательно, так как существуют устройства, самостоятельно определяющие, когда "занимать" линию - для таких устройств обычнотребуется перед передачей пакета передать какой-нибудь незначащий байт (например FF).
Больше, вроде, нюансов нет.

С уважением.


Наверх

Титульная страница Поиск, карта сайта Написать письмо