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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: WinXP работа с LPT  (Прочитано 17946 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dimm
Гость
« : 23-03-2007 07:14 » 

Понадобилось тут выдавать байты в LPT-порт, система Win XP.
Железяка совсем простая - регистр на порт.
Числа надо выдавать побайтно, не блоками.
Первый тестовый код работает:
Код:
char chr;

hnd = CreateFile("\\\\.\\lpt1", ...);
WriteFile(hnd, &chr, 1, ...);
CloseHandle(hnd);
Но при написании, чего то подобного:
Код:
hnd = CreateFile("\\\\.\\lpt1", ...);
... чего то делаем
WriteFile(hnd, &chr, 1, ...);
... опять что то делаем
WriteFile(hnd, &chr, 1, ...);
... и тд.
CloseHandle(hnd);
оказалось, что байты в порт не выдаются. Дальнейшая проверка выявила, что пересылаемые байты копятся в каком-то промежуточном буфере размером 128 байт (видимо в стандартном драйвере LPT-порта), как только этот буфер забивается, только после этого начинают выдаваться в порт.
В и-нете и документации искал - не нашел настроек для LPT-порта средствами Win API.
Пробовал CreateFile c флагами FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED - не работает,
пробовал после каждого WriteFile делать FlushFileBuffers(hnd) - тоже самое.

Кто-нибудь сталкивался с таким?
« Последнее редактирование: 23-03-2007 13:15 от dimm » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 23-03-2007 07:46 » 

dimm, это не настройки порта.
если тебе нужно передавать побайтно или полностью строку, тебе после записи надо освобождать буфер
когда ты закрываешь файл, буфер освобождается
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
dimm
Гость
« Ответ #2 : 23-03-2007 08:41 » 

dimm, это не настройки порта.
если тебе нужно передавать побайтно или полностью строку, тебе после записи надо освобождать буфер
когда ты закрываешь файл, буфер освобождается
Я понял, что буфер освобождается. Вопрос как это сделать? Постоянно, при каждой операции записи открывать/закрывать драйвер? Мне это не подходит, т.к. надо максимальное быстродействие.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-03-2007 09:51 » 

dimm, не открывать/закрывать
после записи  - освобождать!
посмотри функции работы с файлами

Хотя.... только что увидел что ты уже пробовал Flush...
опс...

....т.к. надо максимальное быстродействие.....
с чьей стороны?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 23-03-2007 11:26 » 

Пробовал CreateFile c флагами FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED - не работает

А последний параметр какой ставил?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dimm
Гость
« Ответ #5 : 23-03-2007 13:11 » 

Цитата: Sla
....т.к. надо максимальное быстродействие.....
с чьей стороны?
Скажем так, от момента принятия решения (в программе вычисляется этот байт для внешней железки) до непосредственно выдачи его в порт.
Цитата: Джон
А последний параметр какой ставил?
Непонял, последний параметр чего? CreateFile()?
HANDLE CreateFile(
  LPCTSTR lpFileName,          // pointer to name of the file
  DWORD dwDesiredAccess,       // access (read-write) mode
  DWORD dwShareMode,           // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                               // pointer to security attributes
  DWORD dwCreationDisposition,  // how to create
  DWORD dwFlagsAndAttributes,  // file attributes
  HANDLE hTemplateFile         // handle to file with attributes to
                               // copy
);
Последний параметр это hTemplateFile - NULL как в примерах.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 23-03-2007 14:19 » 

Блин, я имел ввиду конечно предпоследний (последний то и так ясно). А вот предпоследний указывает на
overlapped I/O он должен быть ноль для синхронной передачи.
Вобще покажи все параметры  CreateFile
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dimm
Гость
« Ответ #7 : 23-03-2007 15:26 » 

Код:
hnd = CreateFile("\\\\.\\lpt1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
Параметр dwFlagsAndAttributes уже пробовал по всякому, в разных комбинациях:
FILE_ATTRIBUTE_NORMAL,
FILE_FLAG_NO_BUFFERING,
FILE_FLAG_OVERLAPPED,
FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED.

Чувствую непобедимая это засада в драйвере порта Жаль
Не хотелось мне пользваться хаками типа giveio.sys или portio.sys, хотел стандартными средствами сделать.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 23-03-2007 16:09 » 

а так пробовал?

hnd = CreateFile("\\\\.\\lpt1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dimm
Гость
« Ответ #9 : 24-03-2007 02:47 » 

Попробую в понедельник.
Записан
dimm
Гость
« Ответ #10 : 27-03-2007 00:15 » 

а так пробовал?

hnd = CreateFile("\\\\.\\lpt1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
не работает, тоже самое Жаль
Записан
dimm
Гость
« Ответ #11 : 27-03-2007 05:48 » 

Удалил все установленные, но не подключенные принтеры (и сетевые тоже) и остановил службу "Диспетчер очереди печати" (spoolsv.exe).

Заработало!

Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 27-03-2007 08:15 » 

А ларчик просто открывался Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 27-03-2007 08:49 » 

Так то ж неправильно.
Ведь по большому счету при открытии лпт порта он не лезет на нижний уровень, а идет через дверь, постучался, сказал что будет в свободной форме одежды, а ему в ответ: Нет только в смокинге, а ведь ему нужно еще и печатать Жаль
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
dimm
Гость
« Ответ #14 : 27-03-2007 10:32 » 

Так то ж неправильно.
Ведь по большому счету при открытии лпт порта он не лезет на нижний уровень, а идет через дверь, постучался, сказал что будет в свободной форме одежды, а ему в ответ: Нет только в смокинге, а ведь ему нужно еще и печатать Жаль
Я тоже так думаю, причем тут спулер печати - я ж устройство открываю LPT1, которое существует вне зависимости от того запущен спулер или нет, неужели спулер пихает еще фильтр между драйвером порта и самим портом?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 27-03-2007 12:31 » 

Хм, спуллер может быть  и не причём. А вот про остальное...

Ну дык, не напрямую же вы с ним работаете, а через АПИ ф-ю CreateFile. Ессно это работает через какой-то драйвер. А вот через какой - определяет система.
Попробуйте тот же фокус с CreateFile только с СОМ портом, а потом с подключенной к нему мышкой (если конечно такую ещё найдёте). CreateFile в этом случае возвращает INVALID_HANDLE_VALUE
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 28-03-2007 07:11 » 

хм... я тут подумал... а может не с "\\\\.\\lpt1" надо работать?)))))))))
\Device\Parallel0 с символической ссылкой NONSPOOLLED_LPT1 - это не то что вам надо?)
просто тут глянул на 22 станицу форума драйферов. она же первая с начала)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines