Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с портом RS-232 в режиме ядра  (Прочитано 8086 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vgorskiy
Гость
« : 04-01-2005 18:20 » 

Привет Всем!
Проблема такого рода: имеется устройство работающее по последовательному порту RS-232. Это устройство не соответствует спецификации Plug & Play,
поэтому для драйвера выбрана модель legacy. С передачей данных устройства все идет на ура и прием тоже идет,но если устройство передает больше 16 байт в ответ,то в буфере всего 16 байт и все.

С последовательным портом работаю так:

1) Открываю порт с помощью функции ZwCreateFile:



RtlInitUnicodeString(&deviceExtension->SymbolicLink,L"\\Device\\Serial0");
                

InitializeObjectAttributes(&ObjectAttributes,
                           &deviceExtension->SymbolicLink,
                           OBJ_KERNEL_HANDLE,
                           NULL,
                           NULL );


status = ZwCreateFile(&readerExtension->hPort,
                               GENERIC_READ | GENERIC_WRITE,
                               &ObjectAttributes,
                               &IoStatus,
                               NULL,      // alloc size = none
                               FILE_ATTRIBUTE_NORMAL,
                               FILE_SHARE_READ,
                               FILE_OPEN,
                               FILE_SYNCHRONOUS_IO_NONALERT,
                               NULL,  // eabuffer
                               0 );   // ealength


2) Различные параметры в том числе и размер приемного буффера осуществляется с помощью функции ZwDeviceIoControlFile

3) Чтение осуществляется с помощью функции ZwReadFile записи ZwWriteFile:

status =   
            ZwQueryInformationFile(SmartcardExtension->ReaderExtension->hPort,
                                 &ioStatusBlock,
                    &fileInfo,
                    sizeof(FILE_STANDARD_INFORMATION),
                    FileStandardInformation
                    );


WritePos = fileInfo.EndOfFile;

      /// SEND BUILDED MESSAGE       
        status =
              ZwWriteFile(SmartcardExtension->ReaderExtension->hPort,
                            NULL,
                            NULL,
                            NULL,
                            &ioStatusBlock,
                            SmartcardExtension->SmartcardRequest.Buffer,
                            SmartcardExtension->SmartcardRequest.BufferLength,
                            &WritePos,
                            NULL);


 SmartcardExtension->ReaderExtension->SerialIoControlCode = IOCTL_SERIAL_GET_STATS;
      *(PULONG)SmartcardExtension->SmartcardRequest.Buffer = 0;
     SmartcardExtension->SmartcardRequest.BufferLength = 0L;
      SmartcardExtension->SmartcardReply.BufferLength  =     sizeof(SERIALPERF_STATS);

 status = ZwDeviceIoControlFile (SmartcardExtension->ReaderExtension->hPort, NULL, NULL, NULL,
                                 &ioStatusBlock,
                    SmartcardExtension->ReaderExtension->SerialIoControlCode,
               SmartcardExtension->SmartcardRequest.Buffer,
                                 SmartcardExtension->SmartcardRequest.BufferLength,
               SmartcardExtension->SmartcardReply.Buffer,
               SmartcardExtension->SmartcardReply.BufferLength);





 status =
             ZwReadFile(SmartcardExtension->ReaderExtension->hPort,
                           NULL,
                           NULL,
                           NULL,
                           &ioStatusBlock,
                           SmartcardExtension->SmartcardReply.Buffer,
                           SmartcardExtension->SmartcardReply.BufferLength,
                           NULL,
                           NULL
                           );







Когда сразу после записи с помошью команды IOCTL_SERIAL_GET_STATS узнаю сколько лежит в буфере,а там если больше 16 байт то таки есть 16 байт хотя посылается больше.
Может кто знает в чем проблема? Куда остальные деваются?








Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 04-01-2005 20:35 » 

Какой размер буфера у сериал порта установлен?
Записан

А птичку нашу прошу не обижать!!!
vgorskiy
Гость
« Ответ #2 : 04-01-2005 20:51 » 

Какой размер буфера у сериал порта установлен?

Я заполнял структуру SERIAL_QUEUE_SIZE,в которой указывал входящий 18000,а выходящий 1024 и через ZwDeviceIoControlFile устанавливал это.

Владислав.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 06-01-2005 10:38 » 

Хм...
Странно - не вижу ничего что могло бы полиять... Буду искать Славика...
Записан

А птичку нашу прошу не обижать!!!
vgorskiy
Гость
« Ответ #4 : 07-01-2005 06:17 » 

Хм...
Странно - не вижу ничего что могло бы полиять... Буду искать Славика...

Я и c FIFO возился не помагает. Когда получал статус перед чтением с помощью команды IOCTL_SERIAL_GET_STATS  то в поле структуры  SerialOverrunErrorCount,это как-то связанно  с буферами FIFO. Может дело в том что я с портом работаю как с файлом надо через IRP-пакеты,но у меня legacy-модель поэтому с IRP не получается.
Я тут зацепил свой девайс через FTDI-конвертор и открываю девайс:
 RtlInitUnicodeString(&deviceExtension->SymbolicLink,L"\\Device\\VCP0");

Все работает без проблем.

Владислав.


 
Записан
vgorskiy
Гость
« Ответ #5 : 18-01-2005 04:44 » new

Похоже я разобрался в чем дело: у меня компна процессоре Athlon и он был разогнан и поэтому не работало,когда поставил
стандартную частоту то все заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines