...
if (WriteFile(hLPT,buffer,sizeof(buffer),&dw,&ov)) {
cout << "." << endl;
DWORD dwErrorCode = GetLastError();
LPVOID lpMsg;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,dwErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsg, 0, NULL)
MessageBox(NULL, (LPCTSTR) lpMsg, "Error", MB_OK | MB_ICONHAND);
LocalFree(lpMsg);
}
CloseHandle(hLPT);
...
Работа с LPT
Надо написать на LPT некоторые значения. Для начала хоть что-нибудь. =)
Беру пример
HANDLE hLPT=CreateFile("LPT1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
char buffer[25];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"Hello LPT ");
DWORD dw;
OVERLAPPED ov;
for (int x=0;x < 3;x++)
{
if (WriteFile(hLPT,buffer,sizeof(buffer),&dw,&ov)) cout << "." << endl;
}
CloseHandle(hLPT);
cout << "Closing..." << endl;
}
else cout << "Error Open" << endl;
return 0;
WriteFile возвращает false. Что не так - не пойму. Помогите!
Спасибо, только мне бы хотелось без использования сторонних sys'ек и dll'лек если это возможно...
Надо написать на LPT некоторые значения. Для начала хоть что-нибудь. =)
Беру пример
HANDLE hLPT=CreateFile("LPT1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
char buffer[25];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"Hello LPT ");
DWORD dw;
OVERLAPPED ov;
for (int x=0;x < 3;x++)
{
if (WriteFile(hLPT,buffer,sizeof(buffer),&dw,&ov)) cout << "." << endl;
}
CloseHandle(hLPT);
cout << "Closing..." << endl;
}
else cout << "Error Open" << endl;
return 0;
WriteFile возвращает false. Что не так - не пойму. Помогите![/QUOTE]
Узнай ошибку через GetLastError() после WriteFile.
Код:
"Параметр задан не верно"... Ничего не понимаю.. Помогите, кто понимает,а? =)
Попробуй пока убрать Overlapped.
Код:
HANDLE hLPT=CreateFile("LPT1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
char buffer[25];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"Hello LPT ");
DWORD dw;
OVERLAPPED ov;
if (!WriteFile(hLPT,buffer,sizeof(buffer),&dw,NULL /*&ov*/))
{
cout << "." << endl;
DWORD dwErrorCode = GetLastError();
LPVOID lpMsg;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,dwErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsg, 0, NULL);
MessageBox(NULL, (LPCTSTR) lpMsg, "Error", MB_OK | MB_ICONHAND);
LocalFree(lpMsg);
}
else cout << "!!!" << endl;
CloseHandle(hLPT);
cout << "Closing..." << endl;
}
else cout << "Error Open" << endl;
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
char buffer[25];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"Hello LPT ");
DWORD dw;
OVERLAPPED ov;
if (!WriteFile(hLPT,buffer,sizeof(buffer),&dw,NULL /*&ov*/))
{
cout << "." << endl;
DWORD dwErrorCode = GetLastError();
LPVOID lpMsg;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,dwErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsg, 0, NULL);
MessageBox(NULL, (LPCTSTR) lpMsg, "Error", MB_OK | MB_ICONHAND);
LocalFree(lpMsg);
}
else cout << "!!!" << endl;
CloseHandle(hLPT);
cout << "Closing..." << endl;
}
else cout << "Error Open" << endl;
попробуй WriteFile(hLPT,&buffer,sizeof(buffer),&dw,NULL,&ov), т.е. &buffer
раз виснет, тогда лучше верни &ov
При работе под win посредством CreateFile(), WriteFile() есть одна особенность. Устройство, подключенное к LPT должно сбрасывать в 0 линии ОШИБКА и КОНЕЦ БУМАГИ. Иначе будет висеть.
точно сначало надо поднять протокол обмена принтер комп а после юзать лпт
Уточню. Это хитрый девайс, который управляется с порта подачей на него (порт) чисел от 1 до 15 (больше ему не надо). Мне всего навсего надо это сделать (подавать числа). Сейчас, пока прибора нет, у меня "эмулятор" - схемка, которая диодами показывает напряжение на контактах порта. Я использую inpout32.dll, все замечательно работает, но начальство не хочет использовать "левые" (панимаешь...) примочки. Вообще я пишу на C#, но подобные веши там не предусмотренны. Работа с COM портом - пожалста, а лпт нет... =( На форумах меня послали бороться с API, а я тут... ну... не гуру, как минимум. =) Посему прошу помощи.
Код:
WriteFile(hLPT,&buffer,sizeof(buffer),&dw,NULL)
получил ошибку "устройство не подключено"... Блин, а что же желать?
PS почитай инфу как работает LPT порт вообще
А, все, со второй попытки дошло... =) Спасибо большое всем, кто отозвался.
Лучше позже чем никогда!
Код:
WriteFile(hLPT,&buffer,sizeof(buffer),&dw,NULL)
получил ошибку "устройство не подключено"... Блин, а что же желать?[/QUOTE]
Соединить линию BUSY(11) и Paper End(12) с общим проводим(напр., 20).
Strobe(1) рекомендестя соединить с Acknowledge(10).
[QUOTE=Romikgy]надо поднимать протокол обмена принтер - комп[/QUOTE]
вот и подняли..
После всех манипуляций проведи простой тест.
1.Создай файл 1.in
2.В него запиши один байт 0xFF
3.Затем напиши в комм. строке: copy 1.in LPT1
4.Как результат, файл сразу же скопируется без "подвисаний", а все светодиоды на линиях данных зажгутся. Если же в файле написать 0x00, то, наоборот, потухнут.
Примечание. При передаче потока считаем данные действительными, если на линии Strobe высокий уровень.
http://www.hardwarebook.net/ - тоже погляди
http://cyberelk.net/tim/libieee1284/
Оно в исходниках и работает с портом на низком уровне. Драйвера под Windows, кажется, не требует. Использовать нельзя, зато можно посмотреть как оно устроено.
С общим проводом? BUSY и Paper Out? Это перемкнуть в смысле? "А не @бнет?" =)
Да, соединить линию 11(BUSY), 12(Paper End) и 20(общий провод) одним проводом, а также, уже другим проводом, соединить линию 1(Strobe) и 10(Acknowledge). Не @=нет, если вилку в порт при отключенном от сети устройстве включать. (если серьезно, то перед включением нужно потенциалы общих проводов (корпусов иначе) компа и твоего устройста)