![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с TApdComPort(Async Professional) и с RS485... [D7]
Kolan © (2006-07-25 17:45:00)Здравствуйте,
Проделал эксперимент.
1. Создал новый проект в D7.
2. КинулTApdComPort.
3. Поставил RS485 mode = True.
4. И кнопку. При нажатии кнопки открывается порт.
FPort.Open := True;
5. Слежу за всем шпионом.
Ситуация такая при нажатии на кнопку, те при открытии порта начинается чтение(Rx), те компонент пытается читать из порта...
Хотелось бы понять как заставить его не делать этого....
Только как?
Исходники компонента есть...
Kolan (2006-07-26 01:14:00) [21]
> Уверен ли ты, что тебе именно нужен режим с переключением
> направления передачи по RTS? Это ведь тоже не есть "общепринятый
> стандарт"!
Да точно.
> что эта активность по чтению "статусов" COM-порта просто
> необходима
Возможно этого я не знаю..
> никакой "головной боли" от этой активности
Проблема то в чем. По RS232 с мною писаными объектами все работает.. Далее для перехода к 485 использовал все тоже самое, что и раньше но с TApdComPort. По непонятным причинам стало работать плохо...
Например через опр время InBufferUsed(показаывает сколько байт принято) возврашает всегда 0 хотя данные сыпятся, обмен идет....
Я и незнаю куда копать.. Единственное отличие - это постоянно горящий "светодиод" Rx в шпионе...
PS
Кста шпион оч. хороший LGComSpy++ ниразу не подвел....
PPS
Проблемма кста только с чтение с записью в порт все ок....может я не так пользуюсь компонентом?
Как делаю:
ПроверяюInBufferUsedесли что-то есть, тоGetChar'ом илиGetBlock'ом вычитываю....
GanibalLector (2006-07-26 01:01:00) [22]> да только он не работает.....не реализован.
Как так? А структуру DCB переписал? Она ж в "генофонде" не полная.
З.Ы. Google- Группы - "Delphi 485 CreateFile" (много интересного)
Германн (2006-07-26 00:54:00) [23]
> > можно попробовать задействовать флаг RTS_CONTROL_TOGGLEМожно,
> и там все просто :), да только он не работает.....не реализован.
>
В NT-линейке он реализован, но, имхо, насколько я знаю от других людей, есть проблема с буфером FIFO микросхемы COM-порта.
> > А с чего ты это взял?Шпион показывает...
А вот тут самое главное! Что именно "шпион" показывает? Насколько помню, а дело было довольно-таки давно, ПортМон от Руссиновича показывал очень частые проверки "состояния порта". Это весьма "приблизительное" утверждение, но вот тут более подробное разъяснение из хэлпа:
The Windows communication API provides two methods to check for received data and line/modem status changes: API calls and an event word. The event word is maintained by the Windows communications driver. As data is received or line/modem status changes occur, the driver sets bits in the event word. The application can check the bits to determine if any communication events occurred. If so, the application can make the appropriate API call to clear the event word and retrieve the data or the new line/modem status values.
Windows also provides API calls to retrieve the same status information provided by the event word but the API calls are slower. Async Professional uses the event word by default for the fastest possible performance. Unfortunately, there is at least one communication driver (WRPI.DRV, included with some U.S. Robotics modems) that doesn't appear to support the event word. For this and similar drivers, UseEventWord must be set to False before Async Professional will receive data.
А в контексте сабжа скажу, что эта активность по чтению "статусов" COM-порта просто необходима, если нужно обеспечить правильное переключение RTS в режиме RS485 для любой ОС!
Но! Во-первых, нет, имхо, никакой "головной боли" от этой активности. Есть у меня тестовая программа активно работающая с внешним устройством по стандарту RS485. В ней используется TApdComPort и нет никаких претензий!
Во-вторых. Уверен ли ты, что тебе именно нуженрежим с переключением направления передачи по RTS? Это ведь тоже не есть "общепринятый стандарт"!
Kolan (2006-07-25 23:04:00) [24]
> можно попробовать задействовать флаг RTS_CONTROL_TOGGLE
Можно, и там все просто :), да только он не работает.....не реализован.
> А с чего ты это взял?
Шпион показывает...
Я в состоянии написать простенький компонент для работы с портом(и уже это сделал). Вот с 485 затык...
Ессно мой компонент при октытии порта(по данным шпиона) ни че не читает..
Германн (2006-07-25 21:18:00) [25]
> Какие еще есть варианты кроме написания собств. драйвера,
> и использования этого компонента......
В NT системах можно попробовать задействовать флаг RTS_CONTROL_TOGGLE. Но там тоже не так всё просто.
> при открытии порта начинается чтение(Rx), те компонент
> пытается читать из порта...
А с чего ты это взял? Компонент напрямую не читает из порта. Он берет данные с драйвера, а драйвер уже читает Rx. Если на Rx ничего не передаётся, то и у драйвера ничего нет.
Kolan (2006-07-25 18:44:00) [26]Да да а ртс установить :)
GanibalLector (2006-07-25 18:42:00) [27]А какая разница 232 или 485 ??? CreateFile м вперед
Kolan (2006-07-25 18:02:00) [28]
> Другого способа нет
Точно?
Так а что он там делает?...
Вообще-то проблемма оч. серьезная.. Есть программа, которая работает с портом. Но с 232 нужно сделать на 485... Какие еще есть варианты кроме написания собств. драйвера, и использования этого компонента......
Германн (2006-07-25 17:58:00) [29]
> Ситуация такая при нажатии на кнопку, те при открытии порта
> начинается чтение(Rx), те компонент пытается читать из порта.
> ..
>
> Хотелось бы понять как заставить его не делать этого....
>
> Только как?
Не открывать порт. Другого способа нет. А в исходниках не разберешься.