|
Свой драйвр для COM |
|
|
|
Dec 14 2010, 02:06
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
В силу ряда причин пишу свой драйвер для встроенных в материнку COM портов. Возникло несколько вопросов: 1. Читал, что через биос можно узнать адреса стандартных портов, путем чтения данных по адресу 0040h. Читаю от туда данные, а они постоянно меняются. Верен ли адрес? Где вобще можно узнать адреса стандартных портов? 2. В системе есть один порт с ресурсами 0x3F8-0x3FE, читаю эти адреса, а там одни фф. Получается порт не исправен? Или он на самом деле лежит по другим адресам? Запись других значений ничего не дает, там по прежнему лежат ФФ. Может это из-за того, что порт на самой плате внутри корпуса на разъем выведен (не сзади системника стандартный ДБ9) и он все таки по другим адресам в памяти? 3. На домашнем компе при выполнении пункта 2 вижу нормальные, адыкватные числа. Порт настраивается. Теперь хочу перехватить прерывание. В каких то случаях получается прерывание настроить на свою программу, в каких то нет, возвращается ошибка параметров. Удачный перехват происходит только если в диспетчере задач выключить порт и снова включить. тогда без проблем. до следующей перезагрузки. Можно ли как то этого избежать?
Сообщение отредактировал Timofey - Dec 14 2010, 02:51
|
|
|
|
|
Dec 14 2010, 04:39
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Timofey @ Dec 14 2010, 05:06)  1. Читал, что через биос можно узнать адреса стандартных портов, путем чтения данных по адресу 0040h. Читаю от туда данные, а они постоянно меняются. Верен ли адрес? Где вобще можно узнать адреса стандартных портов? Адрес не 0040h, а 0400h, или в нотации "сегмент-смещение" 0040:0000h. Только это адрес реального режима, или, проще говоря, физический адрес. В драйвере под ОС, работающую в защищённом режиме (Windows, Linux), его необходимо смаппировать в свое адресное пространство. Цитата(Timofey @ Dec 14 2010, 05:06)  2. В системе есть один порт с ресурсами 0x3F8-0x3FE, читаю эти адреса, а там одни фф. Получается порт не исправен? Или он на самом деле лежит по другим адресам? Запись других значений ничего не дает, там по прежнему лежат ФФ. Может это из-за того, что порт на самой плате внутри корпуса на разъем выведен (не сзади системника стандартный ДБ9) и он все таки по другим адресам в памяти? Скорее всего, порт просто не включен в BIOS Setup. Цитата(Timofey @ Dec 14 2010, 05:06)  3. На домашнем компе при выполнении пункта 2 вижу нормальные, адыкватные числа. Порт настраивается. Теперь хочу перехватить прерывание. В каких то случаях получается прерывание настроить на свою программу, в каких то нет, возвращается ошибка параметров. Удачный перехват происходит только если в диспетчере задач выключить порт и снова включить. тогда без проблем. до следующей перезагрузки. Можно ли как то этого избежать? ISA-прерывание не является разделяемым ресурсом, поэтому система не даст подвестить два обработчика прерывания от legacy COM-порта. Если Вы хотите обслуживать COM-порт своим драйвером - стандартный виндовый драйвер необходимо отключить.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Dec 14 2010, 04:46
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Цитата(Demeny @ Dec 14 2010, 09:39)  Адрес не 0040h, а 0400h, или в нотации "сегмент-смещение" 0040:0000h. Понял. Переделал. Заработало на домашнем компе. Цитата(Demeny @ Dec 14 2010, 09:39)  Скорее всего, порт просто не включен в BIOS Setup. Включен. И сама система его видит прекрасно и предлагает с ним работать. Ну тут я еще поковыряюсь. Цитата(Demeny @ Dec 14 2010, 09:39)  ISA-прерывание ... Понял. Спасибо большое за ответы.
|
|
|
|
|
Dec 14 2010, 08:01
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Timofey @ Dec 14 2010, 06:56)  Все дело в том, что программа будет стоять на компе, где уже есть одна прога и для неё были написаны свои драйвера для портов. Ой. Цитата стандартных в системе нет. Ой ой. Цитата стоит вопрос, как не удаляя драйверов той программы. просто закрыв её. пользоваться этими же портами. Ой ой ой! Цитата з.ы. в целом стоит задача реализовать модбас, удачи вам в вашем нелегком труде Windows НЕ ЯВЛЯЕТСЯ системой реального времени, даже на уровне ядра. Т.е. сделать ГАРАНТИРОВАННО рабочий modbus RTU на ней нельзя, можно лишь говорить о вероятности успешной работы и среднем временем до сбоя По поводу драйвера - возьмите DDK/WDK, там есть (в примерах) стандартный драйвер COM порта. Допиливайте его напильником до требуемой кондиции По поводу совместной работы разных драйверов с одними и теми же портами, то это целиком зависит от самих драйверов. Стандартный драйвер COM порта в Windows поддерживает разделение ресурсов (точнее, их захват и освобождение). Если драйвера от 'одной проги' это поддерживают, то все должно срастись
|
|
|
|
|
Dec 14 2010, 13:38
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Да я знаю, что очень точно время считать все равно не получится, но попробую.  DDK - установил, примеры смотрел. что то из них и беру. Спасибо.
|
|
|
|
|
Dec 15 2010, 11:18
|

Знающий
   
Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041

|
Если уж взялись за modbus RTU, то используйте обычные функции ReadFile и WriteFile. Допустимый зазор между байтами задайте просто задав тайм ауты в структуре тайм аутов, их надо подбирать , т к все таки реально получающиеся миллисекунды крепко отличаются от того, что пишем в константы, причем отличаются как от операциоки к операционке, так и от машина от машины. Но вам совершенно не надо выгребать миллисекунды. 1.5 вам не надо совершенно, вам надо опознать конец передачи и все. Для больших скоростей в спецификации RTU введено ограничение 1.7 по моему, точнее не надо, но с точки зрения реализации на компе и это нонсенс - нету таких возможностей. Для скорости 57600 я в константы структуры тайм аутов пишу 6. С просящимся изначально туда числом 2 прием не работает и еще серьезнее не работает если в винде крутится процесс который чего-то хочет: работа по сети, файловые операции, медиаплеер, запуск эксплорера. Пы Сы Через USB вирт компорты или через Ethernet вир com порты modbus rtu работать не будет, может, но это уже будет крепко за спецификациями
|
|
|
|
|
Dec 15 2010, 15:54
|

Знающий
   
Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041

|
Посылайте всех нах. Документ: Modbus_over_serial_line_V1_02 (это хелпик к одному из приборов, я там и спецификации пристегнул) пункт 2.5.1.1. Remark : The implementation of RTU reception driver may imply the management of a lot of interruptions due to the t1.5 and t3.5 timers. With high communication baud rates, this leads to a heavy CPU load. Consequently these two timers must be strictly respected when the baud rate is equal or lower than 19200 Bps. For baud rates greater than 19200 Bps, fixed values for the 2 timers should be used: it is recommended to use a value of 750μs for the inter-character time-out (t1.5) and a value of 1.750ms for inter-frame delay (t3.5). Для скоростей превышающих 19200 два фиксированных значения ДОЛЖНЫ быть использованы : рекомендуется использовать для межсимвольного тайм аута значение 750 мкс в качестве t1.5 и значение 1.75 для межкадровой задержки (t3.5). А на практике в компьюторе никто время считать не умеет. Крепко теоретически можно завести мультемедийный таймер и сдвинуть процессу максимальный приоритет, но в компе есть сетка 1 мс временных интервалов и все. А уж заставить винду каждую миллисекунду чего-то делать - сизифов труд. Это все глупости. При приеме RTU можно воспользоваться без особого гемора возможностями UART, он от рождения аппаратно отслеживает 3.5 временные интервалы между байтами. Но точно сделать вы врядли сможете. В том же документ указано: по мньшей мере 3.5 мс. Мы в своих приборах в руководстве приводим табличку в которой пишем вменяемые цифры межкадрового временного интервала.
|
|
|
|
|
Dec 16 2010, 04:04
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
В ТЗ есть ремарка, что мол да, это противоречит стандарту модбас, но сделать надо так и никак иначе. Кстати, во время работы общался с разными разработчиками и все почему то трактуют модбас по своему. Знаю двоих, которые с пеной у рта доказывали мне, что на любой скорости устройство должно ответить не позже 3,5 байт. Поэтому скорости у себя они закладывали не выше, чем 9600, ибо на тех что выше, контроллер просто не успевал обработать посылку. Когда распеатывал даташит и показывал им стандарт, они говорили, что это я не правильно трактую его и тп ...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|