Текущий архив: 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