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
|
|
« Ответ #1 : 23-03-2007 07:46 » |
|
dimm, это не настройки порта. если тебе нужно передавать побайтно или полностью строку, тебе после записи надо освобождать буфер когда ты закрываешь файл, буфер освобождается
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
dimm
Гость
|
|
« Ответ #2 : 23-03-2007 08:41 » |
|
dimm, это не настройки порта. если тебе нужно передавать побайтно или полностью строку, тебе после записи надо освобождать буфер когда ты закрываешь файл, буфер освобождается
Я понял, что буфер освобождается. Вопрос как это сделать? Постоянно, при каждой операции записи открывать/закрывать драйвер? Мне это не подходит, т.к. надо максимальное быстродействие.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 23-03-2007 09:51 » |
|
dimm, не открывать/закрывать после записи - освобождать! посмотри функции работы с файлами
Хотя.... только что увидел что ты уже пробовал Flush... опс...
....т.к. надо максимальное быстродействие..... с чьей стороны?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
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 » |
|
....т.к. надо максимальное быстродействие..... с чьей стороны?
Скажем так, от момента принятия решения (в программе вычисляется этот байт для внешней железки) до непосредственно выдачи его в порт. А последний параметр какой ставил?
Непонял, последний параметр чего? 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 как в примерах.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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, хотел стандартными средствами сделать.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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).
Заработало!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #13 : 27-03-2007 08:49 » |
|
Так то ж неправильно. Ведь по большому счету при открытии лпт порта он не лезет на нижний уровень, а идет через дверь, постучался, сказал что будет в свободной форме одежды, а ему в ответ: Нет только в смокинге, а ведь ему нужно еще и печатать
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
dimm
Гость
|
|
« Ответ #14 : 27-03-2007 10:32 » |
|
Так то ж неправильно. Ведь по большому счету при открытии лпт порта он не лезет на нижний уровень, а идет через дверь, постучался, сказал что будет в свободной форме одежды, а ему в ответ: Нет только в смокинге, а ведь ему нужно еще и печатать Я тоже так думаю, причем тут спулер печати - я ж устройство открываю LPT1, которое существует вне зависимости от того запущен спулер или нет, неужели спулер пихает еще фильтр между драйвером порта и самим портом?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #16 : 28-03-2007 07:11 » |
|
хм... я тут подумал... а может не с "\\\\.\\lpt1" надо работать?))))))))) \Device\Parallel0 с символической ссылкой NONSPOOLLED_LPT1 - это не то что вам надо?) просто тут глянул на 22 станицу форума драйферов. она же первая с начала)))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|