О COM портах

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 28 мар 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    у меня пару вопросик про СОМ порты.
    1. Сколько в хр может быть максимум СОМ портов ??
    2.Как лучше сделать когда к компу подключено 100 модемов, и в каждый нужно писать/читать, у меня два варианта
    1. Сделать на каждый порт по потоку.
    2. Или подключить все порты и в одном потоке для все поставить поставить эвенты на приход данных + эвент что нужно что-то записать и все это ждать на WaitForMultitpleObjects() .
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    XshStasX
    100 модемов к 1 компу. Извиняюсь за иронию, но - дайте фотку.
    Ответ на первый вопрос: 256 портов.
    Второй вопрос - логичнее было бы выделять потоки. Но можно использовать и волокна (опять же, смотря чего вы добиться хотели), тогда нужно свой диспетчер создать, но это не очень трудно.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    100 потоков это много. Так что второй вариант. но в реалиях врятли больше 10 так что можно 1 использовать.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    TermoSINteZ
    Могу ошибаться, т.к. не работал с com-портами, но разве не проще и одновременно логичнее использовать порты завершения? Они должны вполне эффективно распределить нагрузку на несколько потоков.
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Ничего особенного там ящик в одном ящике 30 тел. подключенные через usb(хаб или концентратор точно не знаю название это устройства, типа удлинитель юсби)))
    к нему через юсби провода подключены телефоны.
    Сейчас 30 модемов работает так так все норм.
    А тут думают еще подключить то есть в итоге окола ста скоро их станет.
    Вот и получается что в программе будет всего 100 потоков.
    Их можно свести к одному если сделать по 2 второму варианту.
    Но есть такая штука как очередь сообщений(это когда ставиться асх. операция в очередь и когда она завершиться о ней сигнализирует эвент), то есть если кинуть 10 запросов на запись и 10 на чтение на каждый модем то получим как бы 2000 ожидающих завершения операций, эти все сообщений сохраняются где то в потоке ?
    И что будет к примеру если уже нет памяти для сообщений?
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    l_inc
    Я просто привел пример того как можно создать обработку очереди. А сами ком порты не связаны, с этим.
    Но имхо потоки выгоднее делать - потому, что каждый поток будет обслуживать один модем. Четкое разделение, четкие правила. И я сомневаюсь что будет огромная нагрузка - модемы - медленные по своей природе - там не будет как на игровых\sql серверах, где такая тактика бы не подошла в принципе. И 100 потоков винда в состоянии обслужить. А писать свой планировщик и с портами завершения возиться для вашей задачи... Не вижу пока _существенных_ аргументов в пользу.

    Памяти какой? Если ситуация с потоком - то для каждого потока вы же выделяете память. Например страницу 4кб, вот если ваш буфер приема допустим 200 байт (сообщение), когда дойдет до предела накопления (+ условие времени, например 5 минут) вы скидываете информацию на диск (если она нужна).
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.918
    XshStasX
    По поводу 256 портов IMHO TermoSINteZ ошибается
    обычные COM порты интегрированные на материнской плате или ISA I/O используют раздельные прерывания (IRQ3 или IRQ4) и фиксированные адреса ввода-вывода
    COM1/COM3 (Диапазон ввода/вывода 03F8h-03FFh IRQ4)
    COM2/COM4 (Диапазон ввода/вывода 02F8h-02FFh IRQ3)
    то есть на каждый COM-порт 8 портов ввода/вывода с фиксированными адресами
    в случае с PCI, прерывания становятся разделяемыми (т.е. все COM порты используют одно прерывание IRQ5 и адреса уже состоят из 4-х цифр (CC00, CC08, CC10, CC18)
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А если идет подключение устройства через юсби, и там дальше драйвер симулирует СОМ порт. то так их 256 или не ограничено ??
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.918
    XshStasX
    Не знаю -- но пространство портов (адреса ввода/вывода) разделено на 64К 8-разрядных пор­тов, 32К 16-раз­рядных портов, 16К 32-разрядных портов или другую ком­бинацию устройств, ко­торые в сум­ме не превышает 64 Кбайт. Из них половина зарезервирована для внутреннего использования фирмой Intel, сопроцессором, стандартными устройствами и т.д. так что в любом случае количество COM-портов ограничено, кроме того каждый COM-порт использует 8 портов (данные, управления, состояния и т.д.)