COM-порт + DispatchWrite/DispatchRead

Тема в разделе "WASM.WIN32", создана пользователем Bill_Prisoner, 2 июн 2005.

  1. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Здраствуйте.

    Опять вопрос, но он действительно соответствует теме!

    Наверное этот вопрос подходит не только для COM-порта, но и для всех драйверов.



    Вот я установил соединение со своим COM-портом.

    Нажимаю на клаву, и диспетчер ввода-вывода вызывает функцию DispatchWrite, т.е. запись в COM-порт.

    Потом опять нажимаю на клаву, и опять запись в COM-порт и т.д.

    А как сделать так чтобы клиент стал получать ответ от COM-порта, т.е. вызывал функию DispatchRead.

    Или может для этого на порт надо прицепить модем.

    В итоге надо сделать чтобы после определенного записанного в порт символа клиент считывал из порта.

    Помогите пожалуйста!
     
  2. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    А сама процедура выглядит так.
    Код (Text):
    1. char sym;
    2. NTSTATUS xDispatchWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
    3. {
    4.  
    5. //xDispatchWrite
    6.     PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
    7.     PAGED_CODE();
    8.     DbgBreakPoint();
    9.     if (Irp->MdlAddress!=NULL)
    10.     {
    11.         char*x=MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriori  ty);
    12.         RtlCopyMemory(&sym,x,1);
    13.     }
    14.     if (sym==0x0a)//Enter
    15.     {
    16.             //Здесь должен быть код, который заставил бы клиента прочитать из порта
    17.     }
    18.  
    19.     Irp->IoStatus.Status = STATUS_SUCCESS;
    20.     Irp->IoStatus.Information=1;
    21.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    22.     return STATUS_SUCCESS;
    23. }




    <font color="red]используем тег CODE</font><!--color-->!
     
  3. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    Посмотри - был ли вызов Read до того, как произошел Write, и если да, то смотри значения таймаутов, возможно нужно было возвращать STATUS_PENDING (не завбыв про IoMarkIrpPending :)



    Если Read-а не было - смотри был ли вызов IOCTL_SERIAL_WAIT_ON_MASK, если да, то надо смотреть параметры WAIT-а



    Это два самых распространенных случая
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Bill_Prisoner



    Еще раз назовешь тему как-нибудь вроде "вопрос жизни и смерти" - удалю, не думая!
     
  5. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    volodya

    А если это правда?