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 байт хотя посылается больше. Может кто знает в чем проблема? Куда остальные деваются?
|