Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Как установить RTS_CONTROL_TOGGLE. Работа с RS-485   Найти похожие ветки 

 
Kolan ©   (2005-07-14 16:02) [0]

Здравствуйте, {}
продолжая
 http://delphimaster.net/view/1-1121337022/

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-14 17:08) [1]


> Да это я читал никак не врублюсь как дойти до этой 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).
Больше, вроде, нюансов нет.

С уважением.


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

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


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

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

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


 
Kolan ©   (2005-07-15 09:36) [4]


> 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;


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


 
wal ©   (2005-07-15 10:16) [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 11:56) [6]

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

Еще вопрос как понять какой режим будет при 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 12:13) [7]


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

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

С уважением.


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

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

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


 
wal ©   (2005-07-18 10:30) [9]


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

С уважением.



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

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
4-1121679144
Asteroid
2005-07-18 13:32
2005.09.04
Как открыть хендл к чужому потоку?


4-1121350719
Narik
2005-07-14 18:18
2005.09.04
уничтожить процесс?


3-1122290285
Layner
2005-07-25 15:18
2005.09.04
FIREBIRD / COLLATE PXW_CYRL


14-1123724503
inew
2005-08-11 05:41
2005.09.04
Вопрос по теории СУБД.


5-1095460856
Чайник
2004-09-18 02:40
2005.09.04
Не понял! Цвета палитры виндовс (типа clBtnShadow и т.д)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский